我知道我可以通过写作来保护自己
int *ptr = malloc(sizeof (*ptr))
代替
int *ptr = malloc(sizeof (int))
好处是,如果您决定将ptr
的类型更改为long*
而不是int*
,则只需在一个位置更改代码。
我的问题是,这种策略是否总是安全的?在任何情况下构造T *ptr = malloc(sizeof(*ptr))
都不起作用吗? T
是某个复杂的结构,指向指针的指针,函数指针还是数组是否重要?或将两者结合使用。
我试图提出一种导致问题的情况,但是对我来说,这似乎很安全。但是我希望能够完全信任代码。
答案 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中并使代码不可读,那将是不安全的。但这被认为是非常糟糕的做法。
函数指针非常具体,因为它们不需要对象(函数)的内存