是sizeof(<type>)而不是sizeof(<variable>)始终安全吗?

时间:2019-06-01 22:01:17

标签: c pointers malloc sizeof

我知道我可以通过写作来保护自己

int *ptr = malloc(sizeof (*ptr))

代替

int *ptr = malloc(sizeof (int))

好处是,如果您决定将ptr的类型更改为long*而不是int*,则只需在一个位置更改代码。

我的问题是,这种策略是否总是安全的?在任何情况下构造T *ptr = malloc(sizeof(*ptr))都不起作用吗? T是某个复杂的结构,指向指针的指针,函数指针还是数组是否重要?或将两者结合使用。

我试图提出一种导致问题的情况,但是对我来说,这似乎很安全。但是我希望能够完全信任代码。

2 个答案:

答案 0 :(得分:1)

我能看到的唯一引起问题的情况是*ptr是否具有可变长度数组类型,因为这是sizeof评估其操作数的唯一情况。

也就是说:

int n = ...;
T (*ptr)[n] = malloc(sizeof *ptr);

具有未定义的行为,因为*ptr的类型为T [n],这是一个可变长度的数组类型,这意味着sizeof会计算其操作数,该操作数将取消引用未初始化的指针({{ 1}})。

但是,很难偶然遇到该问题。通常你会做

*ptr

很好 1


1 嗯,乘法可能会溢出。为了防止这种情况,您需要使用T *ptr = malloc(n * sizeof *ptr); 之类的东西。

答案 1 :(得分:-2)

它安全,便携并且被认为是一种很好的做法。

当然,如果有人将指针隐藏在typedef中并使代码不可读,那将是不安全的。但这被认为是非常糟糕的做法。

函数指针非常具体,因为它们不需要对象(函数)的内存