未定义的行为或可能是带有memset的东西

Undefined behaviour or may be something with memset

本文关键字:memset 未定义      更新时间:2023-10-16

我试图在数组a中保存一个32位数字的二进制等价物。为了测试我的showbits()函数,当我遇到这个东西时,我选择了8,9:

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

000000000000000000000000000

这是8的二进制等价物。当我把memset放在main()方法中时,它可以正常工作,并给我正确的输出。我是不是要出界了(我看不见!)。

我的代码:SHOWBITS:

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 ;
}

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

int main()
{
    int A[32],i;
    showbits(A,8);
    for(i=31;i>=0;i--)
        printf("%d",A[i]);
    return 0;
}

整个测试程序:

#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语句放在showbits()之前的Main方法中时,我得到了正确的输出!

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

39842007522408462686872420075219611920941961187434-2205336646196127610926869242686728268667242007520002029033162196118743419611874788196115651468671619618263761961141748268665201000

方法中的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;
}

其给出以下输出:

From main: 128
From method: 8

因此,内存集设置的位比您想象的要少。

您必须通过引用传递A

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

有关更多详细信息,请参阅此处:C++通过引用传递数组

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;
    // ...
}