48

不能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
4

6 回答 6

82

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

请注意,对于 0 和 -1 以外的其他值,这将不起作用,因为memset*ptr为从以下字节指示的变量开始的内存块设置字节值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。

于 2011-08-26T09:12:50.497 回答
39

不要memset用于初始化单字节数据类型以外的任何东西。

乍一看,它似乎应该用于初始化intto 0or -1(并且在许多系统上它会起作用),但是您没有考虑到您可能会生成陷阱表示,从而导致未定义的行为,或者整数表示不一定是二进制补码的事实。

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

于 2011-08-26T09:41:38.967 回答
11

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

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

注意前后空间...

于 2014-04-14T11:17:21.797 回答
6

为什么要分工?

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

您的版本sizeof(arr)/sizeof(int)为您提供数组中元素的数量。

于 2011-08-26T09:10:48.627 回答
4

您可以通过直接初始化数组来节省一些输入:

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

那条线比 memset 短,而且它也有效。

于 2011-08-26T11:28:35.377 回答
1
void * memset ( void * ptr, int value, size_t num );

当应用于设置字符数组时,此函数在大多数系统上都能很好地工作。它将 ptr 指向的内存块的第一个 num BYTES 设置为指定值(解释为无符号字符)。memset-C++ 参考 每次操作一个字节。因此,如果您为第二个参数分配一个不超过 0xff 的 int 值,它就可以正常工作。

至于你的版本,第三个参数是数组元素的数量,所以你得到了你的输出。实际上,您应该将第三个参数分配给您想要的字节数。

所以正确的版本应该是这样的:

memset (arr, -1, sizeof(arr));
于 2015-04-24T03:15:18.017 回答