2016-09-23 78 views
-7

我有这个代码,我写道,将数组0这段代码如何工作没有任何错误?

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

很简单,但代码是如何工作的,没有任何错误,即使sizeof(arr) = 16(4数组的大小* 4 INT)和大小我使用时,我宣布数组是4,如何memset设置16位为零,我通过作为参数的数组大小为4?

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

+0

在对SO提出问题之前,请先阅读该功能的文档。 – user3286661

+0

为什么你使用上个世纪的函数来绕开C++中的内存? – user463035818

+2

“memset如何将16位设置为零”它将16 _bytes_设置为零,假设sizeof(arr)== 16。 – davmac

回答

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

第三个参数是字节数。你的情况是4 * 4 = 16。

memset

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个字节为零,即该阵列的第一个整数。因此,如果您的意图是将数组的每个元素设置为零,那么解决方案是错误的。