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

Shu*_*rma 1 c++ undefined-behavior

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

当我在函数showbits()中放置memset时,我在代码中面临一个不合理的事情,我正在考虑荒谬的整数,而我期望输出为

00000000000000000000000000001000

这是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 ;
}
Run Code Online (Sandbox Code Playgroud)

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

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

整个测试程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

当我在showbits()之前将那个memset语句放在Main方法中时,我得到了正确的输出!

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

398420075242008462686872420075219611920941961187434-2205336646196127610926869242 68672826866724200752000202903316219611874341961187478819611565142686716196182637 61961141748268665201000

Avi*_*urg 5

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;
}
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

From main: 128
From method: 8
Run Code Online (Sandbox Code Playgroud)

因此,memset设置的位数比您想象的少.