gpt4 book ai didi

c - sizeof() 而不是 sizeof() 总是安全的吗?

转载 作者:行者123 更新时间:2023-12-04 09:28:10 24 4
gpt4 key购买 nike

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

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); 这样的东西。

关于c - sizeof(<variable>) 而不是 sizeof(<type>) 总是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56410742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com