这段代码如何正常运行而没有任何错误?

时间:2016-09-23 09:42:01

标签: c++

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

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

非常简单,但代码如何正常运行,即使sizeof(arr) = 16(4为数组大小* 4为int)和我声明数组时使用的大小为4,如何{{1将16位设置为零,并且作为参数传递的数组的大小为4?

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

第三个参数是字节数。对于你的情况,这是4 * 4 = 16.

memset

答案 2 :(得分:0)

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

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

  

NUM :   要设置为该值的字节数。

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

在您的情况sizeof(arr) = 16中,这正是memset函数请求的字节数。

您的第二个解决方案:

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

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