C语言使用%d占位符给char类型变量赋值问题浅探

经测试,在windows环境下,char a和int b这类形式的是在栈区申请的内存,因此先申请的内存地址比后申请的内存地址要高。

而%d在32位系统中,代表的是4字节int整型数据,如果给高地址的char变量赋值后,再给低地址的char赋值,(前提是这两个变量是先后申请的,他们的地址会紧挨着),那么给低地址赋值的时候就会把高地址赋值的内容给覆盖掉。

测试代码如下:

    //测试使用%d占位符给char类型变量赋值时,实际改动了几个字节(4字节)
    char a;
    scanf("%d",&a);
    printf("%d %d %d %d\n",*&a,*(&a+1),*(&a+2),*(&a+3));    //%d表示的int类型整型值
    /*
    运行:
    25369874        //对应的二进制:1 10000011 00011101 00010010
    18 29 -125 1
    */

 

    char a;
    char b;
    //scanf("%d %d",&a,&b);    //a为高地址,b为低地址,所以先给a赋值再给b赋值的话,a的位置会被b所覆盖掉
    scanf("%d %d",&b,&a);    //因此如果希望成功运算,应该先给低地址的b赋值,再给高地址的a赋值
    printf("%d %d\n",&a,&b);
    printf("%d\n",a+b);
    /*
    运行:
    63 86
    1245007 1245006        //a高 b低
    149
    */

 

posted on 2019-04-17 15:30  二元CH  阅读(1737)  评论(0编辑  收藏  举报

导航