經測試,在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 */