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