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
    */

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM