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

Rav*_*pta 43 c

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

int arr[5];
memset (arr, -1, sizeof(arr)/sizeof(int));
Run Code Online (Sandbox Code Playgroud)

我得到的Vaules是:

arr[0] = -1
arr[1] = 255
arr[2] = 0
arr[3] = 0
arr[4] = 0
Run Code Online (Sandbox Code Playgroud)

Ioa*_*rau 74

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

请注意,对于除0和-1之外的其他值,这将不起作用,因为memset设置*ptr从以下num字节指示的变量开始的内存块的字节值.

void * memset ( void * ptr, int value, size_t num );
Run Code Online (Sandbox Code Playgroud)

并且由于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
Run Code Online (Sandbox Code Playgroud)

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

  • @Patrick B.:它可以在许多平台上正常工作,但不是全部.并非所有平台都使用二进制补码,您也可以通过使用`memset`来初始化`int`来触发陷阱表示. (8认同)
  • 好吧,在这种特殊情况下(对于-1作为值),memset实际上可行.因为int在int8_t中是0xff而在int32_t中是0xffffffff,依此类推.IOW:memset适用于0和-1但对所有其他情况都不是很有用. (6认同)
  • 所有四个字节都具有相同值的每个int都可以使用memset,而不仅仅是0和-1 (2认同)

San*_*ker 33

不要memset用于初始化除单字节数据类型之外的任何其他内容.

乍一看,它似乎可以用于初始化intto 0-1(并且在许多系统上它将起作用),但是你没有考虑到你可能生成陷阱表示,导致未定义的行为,或者整数表示不一定是两个补码的事实.

初始化的阵列正确的方法int-1,是循环阵列之上,并显式地设置每个值.

  • 我认为这个答案应该考虑一个条款,例如"不要使用`memset()`****如果你想编写绝对可移植的代码**".大多数人既不编写也不打算编写可移植代码.当它适用于两种架构时,大多数人称代码为"便携式"."正确方式......"中的"正确"一词也可以改为"便携式".如果你不是在尝试编写绝对可移植的代码,那么它既不是更正确也不是更正确. (8认同)
  • @Complicated请参阅bio @Adam:但事实是,使用循环初始化`int`数组可以保证在所有情况下都能正常工作,而使用`memset`可能无法正常执行(或者更糟糕的是_appear_可以工作) .如果您对代码运行的平台有深入的了解,并且知道它不会导致问题,我不会说您不能使用`memset`.但是我没有关于每个可能阅读这个答案的人的平台的知识,所以我更喜欢安全地玩它.我希望能够平衡我在答案中使用的一些"极端"(为了论证). (8认同)
  • 为 Sander 点赞,我不明白为什么 -1 对我不起作用,直到我意识到我正在使用的机器不是 2 补码。 (2认同)

Fai*_*lde 10

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

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

记住前后的空间 ...


Rud*_*uis 5

为什么分裂?

memset(arr, -1, sizeof(arr));
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,`memset()`设置地址位置_bytes_的值,而不是"项目"的数量.你想将5个字节的字节值设置为"-1".这样做恰好会将int值设置为"-1",这与格式重合. (3认同)

归档时间:

查看次数:

57047 次

最近记录:

8 年,10 月 前