簡體   English   中英

使用指針類型轉換時值發生莫名其妙的變化

[英]inexplicable change in value while using pointer typecasting

#include <stdio.h>
int main( void )
{ 
    int num = 1;
    char *b;

    b = (char*) &num;
    *(++b) = 2;
    printf("%d\n",num);

    return 0; 
}

說明:當我編譯這段代碼時,我遇到了“513”作為輸出。當我對該行使用注釋行時:`*(++b)=2;

Output converts into "1".

問題一:為什么會遇到“513”的輸出?

問題 1:為什么使用我暗示的注釋行時輸出會發生變化?

假設一個int是 32 位的,在你的系統上采用小端字節序, num的表示是0x00000001 ,在內存中看起來像這樣:

-----------------
| 1 | 0 | 0 | 0 |
-----------------

然后你將b指向num

  b
  |
  v
-----------------
| 1 | 0 | 0 | 0 |
-----------------

然后你做*(++b)=2; ,它遞增b ,取消引用遞增的指針,並將 2 寫入該位置。 所以你現在有了。

      b
      |
      v
-----------------
| 1 | 2 | 0 | 0 |
-----------------

所以現在num的表示是 0x00000201`,十進制是 513。

看起來在您的機器上,字符是字節大小的。 這就是為什么您會看到這種完全正常的行為。

您的 num 變量在內存中看起來像這樣。

0x00000001

您獲取它的地址,將其視為 char* 然后將第二個 char 設置為 2,這樣現在您的 num 就變成了。

0x00000201

當您將其轉換回十進制時,它會正確輸出 513。

這個

int num=1;

32 bit系統中表示如下

     0x103      0x102       0x101       0x100  (let's assume base address of num 0x100)
  -----------------------------------------------
 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0001 |
  -----------------------------------------------
                                                num
MSB                                          <--LSB

和這里

char *b; /* char pointer i.e at a time points to 1 byte */
b=(char*)&num; /* b points to &num i.e 0x100 in above diagram */

看起來像

    0x103      0x102       0x101       0x100  
  -----------------------------------------------
 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0001 |
  -----------------------------------------------
                                                num
                                                 b <-- b points here 

現在當這個

*(++b)=2;

被執行,首先發生++b這意味着 char 指針b增加一個字節,即它指向0x101位置,然后僅指向2分配的0x101位置的內容。 看起來像

     0x103      0x102       0x101       0x100  
  -----------------------------------------------
 | 0000 0000 | 0000 0000 | 0000 0010 | 0000 0001 |
  -----------------------------------------------
                                     |          num
                                     b <-- b points to 0x101  

現在,當您打印num時,它會打印512 + 1 ,即513 我希望它能消除你的疑慮。

當我編譯這段代碼時,我遇到了“513”作為輸出。

由於此語句,您得到此輸出:

*(++b)=2;

最初, b指向num 語句*(++b)=2將首先遞增指針b並指向下一個字節,然后取消引用它並分配2
假設在您的平台上int32位,那么:

initially
num = 1

00000000 00000000 00000000 00000001


num after this statement
*(++b)=2;

00000000 00000000 00000010 00000001

which is the binary representation of `513`.

當我對該行使用注釋行時: *(++b)=2; 輸出轉換為“1”。

當然,您已經用1初始化了num並且在不對它進行任何更改的情況下打印num時您還期望什么。

暫無
暫無

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

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