memset为int型数组初始化问题

Posted jiangxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memset为int型数组初始化问题相关的知识,希望对你有一定的参考价值。

头文件:#include <string.h>
memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为:
    void * memset( void * ptr, int value, size_t num );
参数说明:

  • ptr 为要操作的内存的指针。
  • value 为要设置的值。你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换。
  • num 为 ptr 的前 num 个字节,size_t 就是unsigned int。

【函数说明】memset() 会将 ptr 所指的内存区域的前 num 个字节的值都设置为 value,然后返回指向 ptr 的指针。

无法下面这样初始化,这样的结果是a被赋值成168430090,168430090.。。。。。。。。。

int a[10];
memset(a, 1, sizeof(a));

这是因为int由4个字节(说)表示,并且不能得到数组a中整数的期望值。
但我经常看到程序员使用memset将int数组元素设置为0或-1。

int a[10];
int b[10];
memset(a, 0, sizeof(a));  
memset(b, -1, sizeof(b));

根据我的理解,用整数0初始化是可以的,因为0可以在1字节表示(可能是我在这个上下文中错了)。但是怎么可能用-1(一个4字节的值)初始化b?

奇怪的是,使用-1的原因与使用零的原因完全相同:在 two’s complement binary representation中,-1在其所有位中均为1,而不管整数的大小,因此填充具有字节的区域与所有1产生一个区域的-1有符号ints,longs和短路在二的补充硬件。

在不同于二进制补码的硬件上,结果将不同。 -1整数常量将转换为所有1的无符号字符,因为该标准特定于如何执行转换。然而,其所有位被设置为1的字节区域将根据平台的规则被解释为整数值。例如,在符号和幅度硬件上,数组的所有元素将包含相应类型的最小负值。

总结:memset只能为0和-1进行初始化,其他乖乖循环吧。






以上是关于memset为int型数组初始化问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 memset 和 int 值初始化整数数组 - 失败

我想用memset初始化,就像memset(map_page_buf,0x5DB3C70E ,1*sizeof(int)); map_page_buf为int型指针

memset 初始化数组 & 实现原理

为啥memset不能将数组元素初始化为1

为啥memset不能将数组元素初始化为1?(急)

c语言memset()函数