经测试,在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 */