用指向其结构体的指针分配内存,还是直接使用结构体本身来分配内存?

4

在我的实际代码中,我用下面这行代码替换了标有(1)的那一行,并得到了相同的结果:

Date *ptrdate = malloc(12 * sizeof(*ptrdate));

问题: 哪个更好,为什么?

这是我的实际代码:

typedef struct {
    int day;
    int mo;
} Date;

void main(){
    Date *ptrdate = malloc(12 * sizeof(Date)); //(1)

    ptrdate[0].day=26;
    ptrdate[0].mo=5;
    printf("Date:%d/%d\n", ptrdate[0].day, ptrdate[0].mo);
}

5
在C语言中,main()函数的唯一可接受的返回类型是 int - milleniumbug
@Amessihel,我已经更新了问题以使其更清晰。我们要删除评论链吗?[此消息将在1分钟内自毁...:-)] - Sourav Ghosh
2个回答

7
写代码时,您可以这样做:
Date *ptrdate = malloc(12 * sizeof(*ptrdate));

或者,一种更简洁的方法
Date *ptrdate = malloc(12 * sizeof *ptrdate);  //sizeof is operator, no need for extra "()"

将指针ptrdate定义为const类型更被接受并且更为理想,因为它使代码更加健壮。即使

  • ptrdate的类型在未来被更改
  • 与外部库一起使用该代码,该库有一个单独的typedefDate(创建冲突)[#]

您不需要更改此部分代码。

另外,main()函数的推荐签名是int main(void)


[#] 感谢下面@Elias Van Ootegem先生的评论]


抱歉 @iharob,我们同时在编辑。不过我已经合并了你的更改。谢谢。 :-) - Sourav Ghosh
另外,sizeof不是一个函数,因此尽可能省略无意义的括号。 Date *ptrdate = malloc(12 * sizeof *ptrdate); - unwind
3
当你打算使用命令行参数时,可以使用int main(int argc, char *argv[])。如果不需要使用它们,int main(void)就足够了。参考C11标准的第5.1.2.2.1章节。 - Sourav Ghosh
@unwind 感谢您的建议先生。已经相应地进行了更新。 :-) - Sourav Ghosh
@SouravGhosh:除了实际变量更改类型之外,需要通过 typedef 更改名称冲突是倾向于使用 sizeof *ptr 而不是 sizeof(Type) 的另一个原因。参见我的答案。 - Elias Van Ootegem
显示剩余2条评论

1

这更多是品味/风格问题。我更喜欢sizeof(Date),因为我认为这更易读一些。但是你可以随意 - 这里没有实质性的区别。


如果你决定更改typedef语句(例如由于与某些第三方依赖项的名称冲突),那么sizeof(type)可能会使你面临必须重构为结构体分配内存的所有代码的风险。这就是为什么我认为大多数人都喜欢sizeof *ptr_var,因为它没有那么多括号。 - Elias Van Ootegem
@EliasVanOotegem 嗯,这不是每天都会遇到的问题。如果遇到了,仍然需要搜索和替换。因此,风险似乎被高估了。 - Matt
@EliasVanOotegem 顺便说一下,我喜欢括号 :-) - Matt
在处理现有代码时,这并不是每天都会遇到的情况,这点我们可以达成共识。当开发新项目时,这种情况确实可能发生(至少我在开发时会出现这种情况)。顺便说一句:大括号没问题,但我不希望我的 C 代码看起来像 Lisp :-P - Elias Van Ootegem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接