char str[] = "Stanford University";
char a = str[1];
char b = *(char *)((int *)str 3);
char c = str[sizeof(int *)];
和的 char 值是a多少?bc
a = 't'
bis'v'和cis ' '(space)的值。但是c空間是怎么來的?的大小int *為 4 位元組或 8 位元組。在這兩種情況下,我們將有不同的值。此外,b它指向s[12]但如何執行整行,我的意思是首先它被型別轉換,int *然后char *我們正在取消參考或者我們正在做其他事情?
uj5u.com熱心網友回復:
第一個值始終't'是存盤在 C 字串中的第二個字符str。
第二個值取決于int目標平臺上的大小。提示:大多數現代平臺使用 32-bitint和 8-bit char。
第三個值取決于指向的指標的大小int。提示:指標的大小可以不同于int,在現代平臺上它們通常有 64 位。
您在平臺上觀察到的值與int4 位元組(32 位)int *大小和 8 位元組(64 位)大小一致。當前的 64 位系統就是這種情況。
下面是對第二個運算式的解釋:
為了評估*(char *)((int *)str 3),編譯器首先轉換str為指向 的指標int,該指標可能未對齊(*)int ,然后計算指向的陣列中第四個的地址(int *)str,因此距該陣列開頭 12 個位元組,然后將該地址轉換回to char *,保持相同的地址。最后,*讀取后者指向的字符,因此str[3 * 4]即。信'v'。
對于第三個運算式,該行為更易于解釋:
char c = str[sizeof(int *)];只是讀取偏移量的字符sizeof(int *)是8或你的系統,所以c包含,和' '之間的空間。StanfordUniversity
請記住,第二個和第三個運算式都是實作定義的:
- 在使用小型模型的舊 MS/DOS 系統上,您將擁有
b = 'r'和c = 'a',并且使用中型和大型模型,b = 'r'并且c = 'f'; - 在舊的 32 位 Windows、Mac 和 linux 系統上,您將擁有
b = 'v'和c = 'f'; - 在一些具有 64 位的奇異 Cray 系統上
int,計算b會有未定義的行為; - 在某些嵌入式 DSP 處理器上,您甚至可以擁有
b = 'n'和c = 't'.
(*) 未對齊的指標不會被取消參考為int *,但即使只是計算一個無效的地址也會有未定義的行為,因此在奇異的系統上可能會發生一些奇怪的事情。如果您的目標是運行 Windows、macOS 或 linux 的個人計算機,那么這種有風險的地址計算應該不會造成問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/457392.html
