Memset将数组元素设置为0

P R*_*P R 4 c memset

我是一个玩memset和指针的新手.

当我编译并运行时:

main(){
int a;
int *b = (int *)malloc(5*sizeof(int));
memset(b,0, 5*sizeof(int));
if (b != NULL){
    for(a=0;a<4;a++){
        //b[a] = a*a;
        printf
        ("Value of b %u\n", b[a]);
    }   
}
free(b);
b = NULL;
}
Run Code Online (Sandbox Code Playgroud)

我能够将所有元素值打印为0.但是当我将memset行更改为时

memset(b,0, sizeof(b));
Run Code Online (Sandbox Code Playgroud)

我总是得到一个带有大量数字的元素,我认为它是该元素的地址.但是,尝试在元素上打印地址和值时:

printf("Value of b %u and address %u\n", b[a], b+(a*sizeof(int)));
Run Code Online (Sandbox Code Playgroud)

我得到两个不长的数字.

究竟发生了什么?我是否以错误的方式使用了memset?请告诉我是否需要附上输出截图/澄清我的问题.

谢谢!

Bar*_*mar 11

b是一个指针,指针sizeof(b)的大小也是如此,当前系统上很可能是4或8.所以你只是将前几个字节设置为0,而不是整个数组.

如果你已声明b为数组,例如

int b[5];
Run Code Online (Sandbox Code Playgroud)

然后sizeof(b)将是整个数组的大小,你memset会按预期工作.

  • @PR,不,一点也不奇怪.你只是将前几个设置为零,其余部分与`memset`之前完全一样,它们是任意值(包括可能为零).在`memset`之前设置`b [4] = 42`然后检查它. (2认同)