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

来自点击打开链接.byhang

问题代码:


   
   
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4. int array[ 5];
  5. int a;
  6. while(~ scanf( "%d",&a)){
  7. memset( array,a, sizeof( array));
  8. printf( "%d %d\n", array[ 0], array[ 1]);
  9. }
  10. return 0;
  11. }

程序功能:初始化数组元素为输入值。

输入:
-1

0

1

预期输出:
-1 -1
0 0
1 1

实际输出:
-1 -1
0 0
16843009 16843009

原因:


memset是按字节赋值的,取变量a的后8位二进制进行赋值。

1的二进制是(00000000 00000000 00000000 00000001),取后8位(00000001),int型占4个字节,当初始化为1时,它把一个int的每个字节都设置为1,也就是0x01010101,二进制是00000001 00000001 00000001 00000001,十进制就是16843009。

之所以输入0,-1时正确,纯属巧合。

0,二进制是(00000000 00000000 00000000 00000000),取后8位(00000000),初始化后00000000 00000000 00000000 00000000结果是0
-1,负数在计算机中以补码存储,二进制是(11111111 11111111 11111111 11111111),取后8位(11111111),则是11111111 11111111 11111111 11111111结果也是-1

总结:memset()只有在初始化-1,0时才会正确。想要初始化为其他值,我目前会做的就是DIY了。。。

比如:


   
   
  1. int a[ 11];
  2. for( int i= 0;i< sizeof(a)/ sizeof( int);i++){
  3. a[i]= 1;
  4. }

-----------------------------------以下为原创----------------------------

既然4字节的int类型不同, short int 也至少为2字节,那1个字节的char 应该就可以了吧


   
   
  1. char a[ 3];
  2. memset(a, 1, sizeof(a));
果然输出的值就可以了,以后就算是要用到int,要是会默认强制转化的

    • 1
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值