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

标签 c arrays memory integer memset

难道不能对整数数组使用 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为以下 num 字节设置从 *ptr 指示的变量开始的内存块的字节值。

void * memset ( void * ptr, int value, size_t num );

并且由于 int 由多个字节表示,您将无法获得数组中整数的所需值。

异常(exception)情况:

  • 0 是一个异常(exception),因为如果将所有字节都设置为 0,则该值将为零
  • -1 是另一个异常(exception),因为正如帕特里克强调的那样,-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。

关于c - 为什么 "memset(arr, -1, sizeof(arr)/sizeof(int))"不将整数数组清除为 -1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7202411/

相关文章:

c - 几个基本的C问题

c - 如何将 64 字节字符串转换为 20 字节字符串?

c++ - 如何将数据插入到预先分配的 CSV 文件中?

java - 如何仅打印数组中具有重复字符的单词?

c - g_object_new 应该有匹配的 g_object_unref 吗?

c - Structs 的堆和堆栈问题 - C 编程

c - 无法从函数返回字符串

arrays - 从函数返回多维数组

java - 调用另一个类中的方法并存储返回的列表

java - 为什么 MetaSpace Size 是 Used MetaSpace 的两倍?