提问人:Hobbes 提问时间:5/13/2023 更新时间:5/14/2023 访问量:86
为什么我应该在sizeof()中使用void *而不是显式指针类型?
Why should I use void * instead of explicit pointer type in sizeof()?
问:
我在 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 *))
答:
与其使用类型调用,不如使用变量名称。例如,而不是:sizeof
int *foo = malloc(sizeof(int));
更喜欢成语:
int *foo = malloc(sizeof *foo);
这意味着您不会重复 (DRY) 声明的类型,该类型可能会独立更改。如果类型在最好的情况下更改无关紧要,或者您分配了太多内存,最坏的情况是您分配的内存太少,这会导致由于可能很远的更改(例如,在单独的头文件中)而导致损坏。
我觉得方便的另一件事是,这是一个纯粹的机械转换(就像我不必考虑它一样):后跟变量的名称。这样可以消除使用错误类型的错误类。sizeof
*
通常写得更短。
传递类型时需要括号,但传递变量时不需要括号。 按预期方式绑定,因此将按预期分配 42 秒的空间。sizeof
sizeof
sizeof *foo * 42
int
评论
sizeof(int*)
如果你打算将 S 存储在内存中似乎显然比 .甚至不能保证这两种尺寸相同。但无论如何,这不是你引用的评论所暗示的。您引用的评论是在批评您链接的答案。注释是说问题本身中的用法是首选的,例如:该类型仅在 的声明中提及。int*
sizeof(void*)
char *ptr = malloc(sizeof(*ptr) * 50);
ptr
int *foo = malloc(sizeof(int))
int *foo = malloc(sizeof *foo)