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

Why should I use void * instead of explicit pointer type in sizeof()?

提问人:Hobbes 提问时间:5/13/2023 更新时间:5/14/2023 访问量:86

问:

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

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

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

c 指针 malloc sizeof

评论

2赞 user17732522 5/13/2023
sizeof(int*)如果你打算将 S 存储在内存中似乎显然比 .甚至不能保证这两种尺寸相同。但无论如何,这不是你引用的评论所暗示的。您引用的评论是在批评您链接的答案。注释是说问题本身中的用法是首选的,例如:该类型仅在 的声明中提及。int*sizeof(void*)char *ptr = malloc(sizeof(*ptr) * 50);ptr
3赞 Allan Wind 5/13/2023
他们的意思是说而不是做.后者是纯机械的,你不会重复可能会改变的类型。int *foo = malloc(sizeof(int))int *foo = malloc(sizeof *foo)
0赞 Hobbes 5/13/2023
好吧,我误解了评论的上下文。谢谢你们俩!

答:

7赞 Allan Wind 5/13/2023 #1

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

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

更喜欢成语:

int *foo = malloc(sizeof *foo);

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

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

通常写得更短。

传递类型时需要括号,但传递变量时不需要括号。 按预期方式绑定,因此将按预期分配 42 秒的空间。sizeofsizeofsizeof *foo * 42int

评论

0赞 dalfaB 5/13/2023
它不仅书写时间更短,而且还避免了选择类型时经常出现的错误
0赞 Allan Wind 5/14/2023
@dalfaB谢谢。在这一点上重新排序和扩展。
0赞 ad absurdum 5/14/2023
当类型可能发生变化时,这个成语也适用于以后的开发或维护。
0赞 Allan Wind 5/14/2023
@adabsurdum “可能独立变化”不是涵盖这一点吗?例如,我很高兴澄清它。
1赞 ad absurdum 5/14/2023
嗯。。。我想我错过了那一点。