这段代码如何工作而没有任何错误

How do this code work without any errors?

本文关键字:任何 错误 工作 何工作 段代码 代码      更新时间:2023-10-16

我编写了这段代码,将数组设置为0

int arr[4];
memset(arr, 0, sizeof (arr));

非常简单,但是代码如何工作而没有任何错误,即使sizeof(arr) = 16(4数组大小* 4为int)和我声明数组时使用的大小为4,memset如何将16位设置为零,数组i作为参数传递的大小为4?

我使用memset(arr, 0, sizeof(arr)/sizeof(*arr));来获得数组的实际大小,结果是准确的,它给了我4,但上面的代码如何正确工作?

memset设置16字节(不是位)为0。这是正确的,因为数组的大小是16字节,正如您正确声明的那样(4个整数x 4个整数)。sizeof知道数组中元素的数量和每个元素的大小。正如您在文档中看到的,memset的第三个参数接受字节数,而不是元素数。http://www.cplusplus.com/reference/cstring/memset/

但是要小心使用sizeof(),当你传递数组为int x[]int* x时。例如,下面的代码段将不会做您期望的事情:

void foo(int arr[]) {
  auto s = sizeof(arr); // be careful! this won't do what you expect! it will return the size of pointer to array, not the size of the array itself
  ...
}
int a[10];
foo(a);

第三个参数是字节数。也就是4*4=16。

memset

实际上第一个解决方案是正确的。

memset函数将要设置为零的字节数作为第三个参数。

全国矿工工会

:要设置的字节数

sizeof返回表达式占用的字节数。

在你的例子中,sizeof(arr) = 16恰好是memset函数请求的字节数。


你的第二个解决方案:

memset(arr, 0, sizeof(arr)/sizeof(*arr));  // Note that: sizeof(arr)/sizeof(*arr) == 16 / 4 (generally) == 4 bytes

将只将前4个字节设置为0,即数组的第一个整数。因此,如果您的意图是将数组的每个元素设置为0,那么该解决方案是错误的。