为什么“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));