我最近看到的一個代碼示例:
#include <stdio.h>
#include <stdlib.h>
struct x {
int a;
int b;
};
int main(void) {
struct x *ptr = malloc(sizeof(*ptr));
return 0;
}
甚至如何
sizeof(*ptr)作業?如何取消參考未定義的指標并賦予
sizeof()并產生正確的大小?(當然它應該導致未定義的行為,因為它未定義)最后,C 標準是否定義了這種行為?(也許表明它在 C 中是合法的,我找不到任何東西)
uj5u.com熱心網友回復:
ptr此處實際上并未取消參考。運算子的運算元sizeof,在本例中為 expression *ptr,僅針對其型別進行查看。
這在C 標準的第 6.5.3.4p2 節中關于sizeof運算子的詳細說明:
運算子產生其
sizeof運算元的大小(以位元組為單位),它可以是運算式或帶括號的型別名稱。大小由運算元的型別決定。結果是一個整數。如果運算元的型別是變長陣列型別,則計算運算元;否則,不計算運算元,結果為整數常量
在這種特殊情況下,*ptr未評估,但它被視為具有 type struct x,因此sizeof(*ptr)評估為一個常量,它是 的位元組大小struct x。
uj5u.com熱心網友回復:
sizeof不是函式呼叫,它是運算子。它不適用于 的值ptr,而是它的型別。ptr已被宣告為型別struct x*,因此編譯器知道它sizeof(*ptr)等價于sizeof(struct x).
示范。
uj5u.com熱心網友回復:
運算子將sizeof運算式或帶括號的型別作為其引數。除非該引數是可變長度陣列,否則它不會評估其引數。無論哪種方式,大小都是由運算元的型別決定的。
所以,給定一個指標int *p,sizeof *p產生一個的大小,int因為運算式*p有型別int。沒有評估,因此這里沒有取消參考。或者,您可以使用sizeof(int)來查找int. 在第一種情況下,運算元是運算式*p,而在第二種情況下,運算元是帶括號的型別(int)。
值得一提的是,這struct x *ptr = malloc(sizeof(*ptr));是一個有用的 C 習慣用法。*ptr不需要括號,因為*ptr它是一個運算式,而不是一個型別:
struct x *ptr = malloc(sizeof *ptr);
當型別發生變化時,這種結構清晰且易于維護,例如,當struct x不再需要但現在struct y需要時,只需更改一件事:
struct y *ptr = malloc(sizeof *ptr);
在這個簡單的變化之后ptr是一個指標struct y,并且已經為一個分配了正確的記憶體量struct y。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506455.html
上一篇:如何解釋C中陣列的指標?
下一篇:指標比較
