为什么我应该在 sizeof() 中使用 void * 而不是显式指针类型?

问题描述 投票:0回答:1

我在 StackOverflow 答案下阅读了这条评论 (https://stackoverflow.com/a/3331268/17342809):

内存分配请求应尽可能与类型无关:不对内存分配函数的结果进行强制转换,并且在 sizeof 下没有类型名称。在 malloc 请求(等等)中使用 sizeof 下的类型名称的奇怪习惯早已在 C 编程的垃圾箱中占有一席之地。类型名称属于声明。如果不是声明,则不允许使用类型名称(尽可能)。

我可以理解为什么转换

malloc()
的结果是不好的(通过阅读另一个问题的答案:https://stackoverflow.com/a/605858/17342809)。但是,在我看来,在内存分配中使用 sizeof() 中的类型名称(例如
sizeof(int *)
而不是
sizeof(void *)
)应该会使您的代码更易于阅读,因为读者可以立即看到您打算将此内存用于什么. 有人能解释一下为什么在
malloc(sizeof(type *))
中使用显式指针类型是个坏习惯吗?

c pointers malloc sizeof
1个回答
0
投票

而不是用类型调用

sizeof
更喜欢使用变量名。例如代替:

int *foo = malloc(sizeof(int));

喜欢:

int *foo = malloc(sizeof *foo);

这意味着您没有重复(DRY)可能独立更改的声明类型。最好的情况是无关紧要,或者您分配的内存太多,最坏的情况是您分配的内存太少,这会由于可能发生在远处的更改(例如,在单独的头文件中)而导致损坏。

写起来通常比较短

我觉得方便的另一件事是它是一个纯粹的机械转换(因为我不必考虑它):

sizeof
后跟
*
和变量的名称。

传递类型

sizeof
时需要括号,但如果传递变量则不需要。
sizeof
以您期望的方式绑定,因此
sizeof *foo * 42
将按预期为 42
int
s 分配空间。

© www.soinside.com 2019 - 2024. All rights reserved.