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

Hob*_*bes 1 c malloc pointers sizeof

我在 StackOverflow 答案(/sf/answers/233188791/)下读到了这条评论:

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

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

All*_*ind 7

sizeof与其使用类型调用,不如使用变量名称。例如代替:

int *foo = malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

更喜欢这个习语:

int *foo = malloc(sizeof *foo);
Run Code Online (Sandbox Code Playgroud)

这意味着您不会重复(DRY)可能独立更改的声明类型。如果类型在最好的情况下发生变化,那并不重要,或者您分配了太多的内存,最坏的情况是您分配了太少的内存,这会由于可能很远的更改(例如,在单独的头文件中)而导致损坏。

我觉得方便的另一件事是,它是纯粹的机械转换(就像我不必考虑它一样):sizeof后面*跟着变量的名称。这消除了使用错误类型的错误类别。

通常写得比较短。

当传递类型时需要括号,sizeof但如果传递变量则不需要。 sizeof按照您期望的方式绑定,因此会按预期sizeof *foo * 42分配 42 秒的空间。int