C语言 为什么要在sizeof()中使用void * 而不是显式指针类型?

hfyxw5xn  于 2023-05-16  发布在  其他
关注(0)|答案(1)|浏览(101)

我在一个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 *))中使用显式指针类型是一个坏习惯吗?

0h4hbjxa

0h4hbjxa1#

而不是调用sizeof与类型更喜欢使用变量名。例如,而不是:

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

更喜欢成语:

int *foo = malloc(sizeof *foo);

这意味着你没有重复(DRY)声明的类型,它可能会独立地改变。如果类型发生了变化,在最好的情况下,这并不重要,或者你分配了太多的内存,最坏的情况是你分配了太少的内存,这会导致损坏,因为可能会发生很远的变化(比如,在一个单独的头文件中)。
我觉得方便的另一件事是,它是一个纯粹的机械转换(因为我不必考虑它):sizeof后跟*和变量名。这消除了使用错误类型的错误类别。
通常写起来比较短。
当你传递一个sizeof类型时,括号是必需的,但如果你传递一个变量,括号就不是必需的。sizeof以您期望的方式绑定,因此sizeof *foo * 42将按预期为42个int分配空间。

相关问题