[英]inexplicable change in value while using pointer typecasting
#include <stdio.h>
int main( void )
{
int num = 1;
char *b;
b = (char*) #
*(++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*)# /* 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
。
假設在您的平台上int
是32
位,那么:
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.