【发布时间】:2021-10-19 09:16:01
【问题描述】:
我看到了形式的声明
int *p3 = calloc(4, sizeof *p3);
在某些代码中。使用这种 decleration 而不是命名类型有什么好处
int *p3 = calloc(4, sizeof(int));
【问题讨论】:
-
首先,如果您要将
p3的类型更改为其他类型,则无需更改sizeof。出错的可能性较小。
标签: c
我看到了形式的声明
int *p3 = calloc(4, sizeof *p3);
在某些代码中。使用这种 decleration 而不是命名类型有什么好处
int *p3 = calloc(4, sizeof(int));
【问题讨论】:
p3 的类型更改为其他类型,则无需更改sizeof。出错的可能性较小。
标签: c
简单:
如果有人出现并将p3 的类型更改为int 以外的类型怎么办?如果他们忘记更改初始化程序中重复提及的int,那么您现在很难找到错误。
使用sizeof *p3 时,不会发生这种情况。
代码中的冗余可以是好的;但事实并非如此,因为这里的冗余不是由编译器保证的,无助于使代码更清晰,也没有其他用途。
【讨论】:
sizeof *p3 更改为*p3 以外的其他内容怎么办?我不明白为什么这比他们更改声明的类型更不可能。我也主要支持sizeof *p3 风格,但事实是支持/反对它的论点非常主观。基本上没有办法保护程序员免受他们自己的伤害——如果维护代码的人不知道他们在做什么,那么世界上没有任何聪明的技巧可以拯救他们。
sizeof 表达式,代码现在将无法编译。 ——所以我不同意你的观点,这完全是主观的:它将一个相当常见的错误来源换成了一个非常罕见的错误来源。你的最后一点评论只有 C 程序员才能说,对不起:许多其他语言非常有效地保护程序员免受自己的伤害。
sizeof *p3 更改为*p3 以外的其他内容怎么办?”没有意义,因为除了一些与代码目的无关的完全随机的输入错误之外,没有其他理由发生这种情况。一旦一个人采用了使用sizeof *p 的习惯用法,其中p 是被分配的东西,就没有理由在那里使用其他任何东西。不会写sizeof *p[3] 或sizeof **p 或sizeof -*p 或其他任何东西。这就像说我们不应该使用+ 进行加法,因为可能会写错操作数。
sizeof *p3 * n。这反过来很容易以多种方式搞砸,例如sizeof(*p3 * n)。