[英]Instead of using sizeof(type), use sizeof *p,is it safe and correct?
[英]Is sizeof(<variable>) instead of sizeof(<type>) always safe?
我知道我可以通過寫作來保護自己
int *ptr = malloc(sizeof (*ptr))
代替
int *ptr = malloc(sizeof (int))
好處是,如果您決定將ptr
的類型更改為例如long*
而不是int*
,那么您只需要在一處更改代碼。
我的問題是,這種策略總是安全的嗎? 是否存在構造T *ptr = malloc(sizeof(*ptr))
不起作用的情況? 如果T
是一些復雜的結構、指向指針的指針、函數指針或數組,這有關系嗎? 或者它們的組合。
我試圖想出一個會導致問題的情況,但對我來說這似乎是安全的。 但我希望能夠完全信任代碼。
我能看到的唯一導致問題的情況是*ptr
是否具有可變長度數組類型,因為這是sizeof
評估其操作數的唯一情況。
那是:
int n = ...;
T (*ptr)[n] = malloc(sizeof *ptr);
具有未定義的行為,因為*ptr
的類型是T [n]
,它是一個可變長度數組類型,這意味着sizeof
評估其操作數,它取消引用未初始化的指針 ( *ptr
)。
但是,很難偶然遇到這個問題。 通常你會這樣做
T *ptr = malloc(n * sizeof *ptr);
這很好1 。
1好吧,乘法可能會溢出。 為了防止這種情況,你需要像T *ptr = calloc(n, sizeof *ptr);
.
它安全、便攜,被認為是一種很好的做法。
當然,如果有人將指針隱藏在 typedef 中並使代碼不可讀,那將是不安全的。 但這被認為是一種非常糟糕的做法。
函數指針非常具體,因為它們不需要對象(函數)的內存
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.