我在 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 *))
中使用显式指针类型是个坏习惯吗?
而不是用类型调用
sizeof
更喜欢使用变量名。例如代替:
int *foo = malloc(sizeof(int));
喜欢:
int *foo = malloc(sizeof *foo);
这意味着您没有重复(DRY)可能独立更改的声明类型。最好的情况是无关紧要,或者您分配的内存太多,最坏的情况是您分配的内存太少,这会由于可能发生在远处的更改(例如,在单独的头文件中)而导致损坏。
写起来通常比较短
我觉得方便的另一件事是它是一个纯粹的机械转换(因为我不必考虑它):
sizeof
后跟 *
和变量的名称。
传递类型
sizeof
时需要括号,但如果传递变量则不需要。 sizeof
以您期望的方式绑定,因此 sizeof *foo * 42
将按预期为 42 int
s 分配空间。