簡體   English   中英

用C語言理解這段代碼的output

[英]Understanding the output of this code in C language

#include<stdio.h> 

void main()

{
    int a,b;
    char *cp;

    a=511;

    cp=&a;

    b=*cp;

    *cp=10;

    printf("%d %d %d",a,b,*cp);
}

它在 gcc 中給出266 -1 10並發出警告:從不兼容的指針類型 'int *' [-Wincompatible-pointer-types] cp=&a; 分配給 'char *' 我知道 cp 是一個字符指針,所以它給了我一個警告。

我無法理解 a 和 b 的 output;

您得到的答案將取決於您的特定處理器如何存儲 integer。 在 32 位“小端”機器上,它將在 memory 的某處存儲數字 511(十六進制為 1FF):

FF 01 00 00

從最低 memory 位置 (FF) 到最高 (00)。 然后,您獲取“a 的地址”並說“使它成為字符指針”並將其分配給“cp”。

除非您錯過了“制作這個”部分,而 gcc 會為您執行此操作 - 這就是您收到警告的原因。 要刪除警告,您必須告訴 gcc:“是的,我想這樣做”。 您可以通過顯式獲取 integer 指針並將其轉換為字符指針來做到這一點:

cp = (char *)&a;

好的。 所以現在你有一個字符指針指向你存儲 FF 的第一個地址。 您取消引用此(使用 *cp)以獲取已簽名的 char this 的值是-1,你把它放在 b 中。

然后將 FF 更改為 0A(十進制為 10)。 memory 現在看起來像這樣:

0A 01 00 00
    int a,b;
    char *cp;

    a=511;

    cp=&a;

char類型變量的范圍是[-128 to 127]int的范圍是[-32,768 to 32,767][-2,147,483,648 to 2,147,483,647]

因此,當您將需要更多位的較大數據類型存儲到需要較少位的較小數據類型中時,它將導致窄轉換,更恰當地稱為不安全類型轉換。

嘗試將值分配a char[-127 to 128]范圍內的值,然后您將獲得可預測的 output,否則,它可能是未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM