为什么“memset(arr,-1,sizeof(arr)/ sizeof(int))”不能将整数数组清除为-1?

是不可能在整数数组上使用memset? 我尝试了下面的memset调用,并没有得到int数组中的正确的整数值。

int arr[5]; memset (arr, -1, sizeof(arr)/sizeof(int)); 

我得到的Vaules是:

 arr[0] = -1 arr[1] = 255 arr[2] = 0 arr[3] = 0 arr[4] = 0 

只需更改为memset (arr, -1, sizeof(arr));

请注意,对于除0和-1之外的其他值,这将不起作用,因为memset会设置内存块的字节值,该内存块将以*ptr指示的variables开头,用于接下来的num个字节。

 void * memset ( void * ptr, int value, size_t num ); 

而且由于int在多个字节上表示,所以你不会在你的数组中获得所需的整数值。

例外:

  • 0是一个例外,因为如果将所有字节设置为0,则值将为零
  • -1是另一个例外,因为Patrick突出显示-1在int8_t中为0xff(= 255),在int32_t中为0xffffffff

你得到的原因是:

 arr[0] = -1 arr[1] = 255 arr[2] = 0 arr[3] = 0 arr[4] = 0 

是因为,在你的情况下,一个int的长度是4个字节(32位表示),你的数组的长度是20(= 5 * 4),你只设置5个字节为-1(= 255)而不是20。

不要使用memset来初始化除单字节数据types以外的其他内容。

乍一看,它可能似乎应该为int初始化为0-1 (在许多系统上它将工作),但是你没有考虑到你可能会产生陷阱表示的可能性,造成未定义的行为,或整数表示不一定是二进制补码的事实。

int数组初始化为-1的正确方法是遍历数组,并显式设置每个值。

gcc提供了一个很好的数组初始化快捷键

int arr[32] = {[0 ... 10] = 3, [11 ... 31] = 4}

介意前后的空间

为什么这个师?

 memset(arr, -1, sizeof(arr)); 

您的版本sizeof(arr)/sizeof(int)给出了数组中元素的数量。

你可以通过直接初始化数组来保存一些input:

 int arr[5] = {-1, -1, -1, -1, -1}; 

该行比memset短,也是有效的。

 void * memset ( void * ptr, int value, size_t num ); 

当应用于设置char数组时,这个函数在大多数系统上工作良好。 它将ptr指向的内存块的第一个数字BYTES设置为指定值(解释为无符号字符)。 memset-C ++参考它每次运行一个字节。因此,如果您将第二个参数赋值为不超过0xff的整型值,则工作正常。

至于你的版本,第三个参数是数组元素的数量,所以你得到了你的输出。 其实事实是,你应该分配第三个参数你想要的字节数。 所以正确的版本应该是这样的:

 memset (arr, -1, sizeof(arr));