這里是C的新手,我正在研究指標。所以我的問題是“變數分配的位元組是否在記憶體中連續?” 是因為我認為通過從整數指標創建 char 指標(char *p_c = p_i - (sizeof(char))),char 指標將精確指向整數的第二個位元組。
例如:一個整數變數占用 4 個位元組,一個 char 變數占用 1 個位元組。
#include <stdio.h>
int main(){
int a = 4276545;
int *p = &a;
char *p_c1 = p - (1*sizeof(char));
printf("Value of p_c1 (second byte of a) is %c\n", *p_c1);
}
二進制中的 ASCII 'A' 字符是 01000001。十進制到二進制的 4276545 是 00000000 01000001 01000001 01000001。
p_c1不是指向00000000 01000001 01000001 01000001嗎?
列印 *p_c1,我原以為它是“A”,但它列印了“P”。而且它不是一個在每次執行中總是改變的隨機字符,它總是列印'P'。為什么?
uj5u.com熱心網友回復:
sizeof(char)保證為 1(無論它有多少位),所以你有char *p_c1 = p - 1;
問題1:
當您添加或減去指標時,您將地址更改為sizeof(*p),因此您不是將地址更改為一個位元組,而是更改為sizeof(int)位元組。由于a[i] == *(a i)等效性,這是必要的。
問題2:
當你應該添加時,你正在減去。某物的地址是它開始的地址,因此減法會導致a. 你想搬進a,所以你想添加。
固定的:
int a = 0x41424344;
char *p = (char *)&a;
for ( size_t i=0; i<sizeof(int); i )
printf( "%zu %d %c\n", i, *(p i), *(p i) );
輸出因系統而異,但您應該在具有char8 位大小和int32 位大小的型別的小端系統上獲得以下內容:
0 68 D
1 67 C
2 66 B
3 65 A
uj5u.com熱心網友回復:
An integer variable takes 4 bytes
這是一個錯誤的說法。正確的說法是整數至少占用 2 個位元組ifCHAR_BIT=8和至少 1 個位元組if CHAR_BIT>=16。有些系統的 CHAR_BIT 為 64,并且在此類系統上sizeof(TYPE) = 1適用于所有型別。這個想法是,一個int的大小必須至少為 16 位。有些系統需要進行幾次提取才能將整數帶入暫存器。
char *p_c1 = p - (1*sizeof(char));
你可以設想一個整數變數int a,比如長度為 1 的陣列。如果你取整數的地址,就像取陣列第一個元素的地址一樣。
您嘗試做的是取a(because (1 times sizeof(char) )= 1) 地址之前的前一個整數,并考慮該整數的第一個位元組。這是不正確的,訪問超出其限制的陣列或訪問未顯式分配給變數的地址是未定義的行為。
uj5u.com熱心網友回復:
正如@ikegami 所說“當您添加或減去指標時,您通過 sizeof(*p) 更改地址”,因此通過型別轉換并添加 1,我能夠訪問 a 的第二個位元組,現在它正在列印 'A '
#include <stdio.h>
int main(){
int a = 4276545;
int *p = &a;
char *p_c1 = (char*) p 1;
printf("Value of p_c1 (second byte of a) is %c\n", *p_c1);
}
謝謝大家的評論,學到了很多
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/462100.html
上一篇:關于fread功能的說明
下一篇:列印txt檔案的10個最佳結果
