不能memset
在整数数组上使用吗?我尝试了以下memset
调用,但没有在int
数组中获得正确的整数值。
int arr[5];
memset (arr, -1, sizeof(arr)/sizeof(int));
我得到的价值观是:
arr[0] = -1
arr[1] = 255
arr[2] = 0
arr[3] = 0
arr[4] = 0
只需更改为memset (arr, -1, sizeof(arr));
请注意,对于 0 和 -1 以外的其他值,这将不起作用,因为memset*ptr
为从以下字节指示的变量开始的内存块设置字节值num
。
void * memset ( void * ptr, int value, size_t num );
并且由于int
在多个字节上表示,因此您将无法获得数组中整数的所需值。
例外:
你得到的原因:
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
用于初始化单字节数据类型以外的任何东西。
乍一看,它似乎应该用于初始化int
to 0
or -1
(并且在许多系统上它会起作用),但是您没有考虑到您可能会生成陷阱表示,从而导致未定义的行为,或者整数表示不一定是二进制补码的事实。
int
初始化to数组的正确方法-1
是遍历数组,并显式设置每个值。
gcc 提供了一个很好的数组初始化快捷方式
int arr[32] = {[0 ... 10] = 3, [11 ... 31] = 4}
注意前后空间...
为什么要分工?
memset(arr, -1, sizeof(arr));
您的版本sizeof(arr)/sizeof(int)
为您提供数组中元素的数量。
您可以通过直接初始化数组来节省一些输入:
int arr[5] = {-1, -1, -1, -1, -1};
那条线比 memset 短,而且它也有效。
void * memset ( void * ptr, int value, size_t num );
当应用于设置字符数组时,此函数在大多数系统上都能很好地工作。它将 ptr 指向的内存块的第一个 num BYTES 设置为指定值(解释为无符号字符)。memset-C++ 参考 每次操作一个字节。因此,如果您为第二个参数分配一个不超过 0xff 的 int 值,它就可以正常工作。
至于你的版本,第三个参数是数组元素的数量,所以你得到了你的输出。实际上,您应该将第三个参数分配给您想要的字节数。
所以正确的版本应该是这样的:
memset (arr, -1, sizeof(arr));