我最近看到的一個代碼示例:
#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中陣列的指標?
下一篇:指標比較