Memset 将数组元素设置为 0

Posted

技术标签:

【中文标题】Memset 将数组元素设置为 0【英文标题】:Memset to set array elements to 0 【发布时间】:2013-08-30 01:32:53 【问题描述】:

我是一个玩 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;

我可以将所有元素的值打印为 0。但是,当我将 memset 行更改为

memset(b,0, sizeof(b));

我总是得到一个具有大量数字的元素,我认为它是那个元素的地址。但是,在尝试使用以下元素同时打印地址和值时:

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

我得到两个不一样的长数字。

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

谢谢!

【问题讨论】:

您可能应该在for 循环中使用a&lt;5,并且您可能希望在memset 之前检查NULL。并且不要在 C 中强制转换 malloc 的返回值。这是不必要的,可以隐藏细微的错误。 【参考方案1】:

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

如果您已将 b 声明为数组,例如

int b[5];

那么sizeof(b) 将是整个数组的大小,而您的memset 将按预期工作。

【讨论】:

谢谢。但是在多次运行程序时,我总是遇到只有第三个元素有不同的值而不是0。这只是巧合吗? 是的,但更具体地说,它是“未定义的行为”。有时你会得到正确的值,有时你不会,有时程序会为你洗狗。 @PR,不,一点也不奇怪。您只是将前几个设置为零,其余的与memset 之前的完全相同,它们是任意值(可能包括零)。在memset 之前设置b[4] = 42,然后再检查它。

以上是关于Memset 将数组元素设置为 0的主要内容,如果未能解决你的问题,请参考以下文章

为啥memset不能将数组元素初始化为1?(急)

memset使用技巧

为啥memset不能将数组元素初始化为1

memset初始化

静态数组上的 memset

memset()没有将值设置为一个[重复]