Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未定义的行为或可能与memset有关_C++_Undefined Behavior - Fatal编程技术网

C++ 未定义的行为或可能与memset有关

C++ 未定义的行为或可能与memset有关,c++,undefined-behavior,C++,Undefined Behavior,我试图在数组a中保存相当于32位数字的二进制。为了测试我的showbits函数,当我遇到这个问题时,我选择了8,9: 当我在函数showbits中放置memset时,我在代码中遇到了一个不合理的问题,我得到的是荒谬的整数,而我期望的输出是 0000000000000000000000000000 1000 这是8的二进制等价物。当我将memset放在main方法中时,它工作正常并提供正确的输出。我是否超出了边界?我看不到它 我的代码: 展品: 注意:我已将memset放在showbits中,但得

我试图在数组a中保存相当于32位数字的二进制。为了测试我的showbits函数,当我遇到这个问题时,我选择了8,9:

当我在函数showbits中放置memset时,我在代码中遇到了一个不合理的问题,我得到的是荒谬的整数,而我期望的输出是

0000000000000000000000000000 1000

这是8的二进制等价物。当我将memset放在main方法中时,它工作正常并提供正确的输出。我是否超出了边界?我看不到它

我的代码: 展品:

注意:我已将memset放在showbits中,但得到的答案不正确! 主要内容:

整个测试程序:

#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
void showbits(int A[32],int num)
{
    int k=0;
    memset(A,0,sizeof(A));
    while(num>0)
    {
        A[k] = num&1;
        k++;
        num>>=1;
    }
    return ;
}
int main()
{
    int A[32],i;
    showbits(A,8);
    for(i=31;i>=0;i--)
        printf("%d",A[i]);
    return 0;
}
当我将memset语句放在Main方法的showbits之前时,我得到了正确的输出

编辑 如果有人对我得到的东西感兴趣

398420075242008462686872420075219611920941961187434-22053366461961276109268692242 68672826866724200752000202903316219611874341961187478819611565142686716196182637 61961141748268665201000

方法中的A[32]实际上只是指向A的指针。因此,sizeof是*int的大小。采用以下测试代码:

void szof(int A[32])
{
    std::cout << "From method: " << sizeof(A) << "\n";
}
int main(int argc, char *argv[])
{
    int B[32];
    std::cout << "From main: " << sizeof(B) << "\n";
    szof(B);
    return 0;
}
因此,memset设置的位比您想象的少。

方法中的A[32]实际上只是指向A的指针。因此,sizeof是*int的大小。使用以下测试代码:

void szof(int A[32])
{
    std::cout << "From method: " << sizeof(A) << "\n";
}
int main(int argc, char *argv[])
{
    int B[32];
    std::cout << "From main: " << sizeof(B) << "\n";
    szof(B);
    return 0;
}
因此,memset设置的位比您想象的要少。

您必须通过引用传递一个

void showbits(int (&A)[32],int num)
有关更多详细信息,请参见此处:

您必须通过引用传递

void showbits(int (&A)[32],int num)

有关更多详细信息,请参见此处:

Avi已在代码中解释了问题。另一种可能的解决方案是使用C++风格的数组,而不是C风格的数组和memset。那么就不可能出现memset长度错误。而且没有性能损失

#include <array>

void showbits(std::array<int, 32> &A, int num)
{
    A = {};     // set all entries to 0
    // ...
}

int main()
{
    std::array<int, 32> A;
    // ...
}

Avi已经在你的代码中解释了这个问题。另一种可能的解决方案是使用C++风格的数组,而不是C风格的数组和memset。那么就不可能出现memset长度错误。而且没有性能损失

#include <array>

void showbits(std::array<int, 32> &A, int num)
{
    A = {};     // set all entries to 0
    // ...
}

int main()
{
    std::array<int, 32> A;
    // ...
}

我从来没有想过这个方向!格雷蒂从来没有想过这个方向!格雷托:对不起,你说得对。我将尝试编辑我的答案。@Avi请原谅,我认为在这种情况下,sizeofA将返回128,这是我们所期望的。指针与引用不同。如果A被声明为*int,那么它sizeofA返回机器的单词大小。我不知道,当我尝试执行他所说的操作时,我得到了正确的输出!当我试图在showbits函数中打印A的大小时,它确实给出了真实A的正确大小,即128字节@user4581301@ShubhamSharma是的,没错。我也在我的机器上尝试了这个,它给出了预期的结果。我在标记Avi上的错误,我的评论应该指向@user4581301Oh抱歉,你是对的。我将尝试编辑我的答案。@Avi请原谅,我认为在这种情况下,sizeofA将返回128,这是我们所期望的。指针与引用不同。如果A被声明为*int,那么它sizeofA返回机器的单词大小。我不知道,当我尝试执行他所说的操作时,我得到了正确的输出!当我试图在showbits函数中打印A的大小时,它确实给出了真实A的正确大小,即128字节@user4581301@ShubhamSharma是的,没错。我也在我的机器上尝试了这个,它给出了预期的结果。我在标记Avi上的错误,我的评论应该指向@user4581301