簡體   English   中英

是 sizeof(<variable> ) 而不是 sizeof(<type> ) 總是安全的?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM