malloc应该给指针的大小还是内存的大小?

5

我在阅读Beej的网络编程指南时,在第45页发现了以下代码片段:

struct pollfd *pfds = malloc(sizeof *pfds * fd_size);

我在想,它该是这样吗?

struct pollfd *pfds = malloc(sizeof(struct pollfd) * fd_size);

由于malloc返回指向指定大小内存块的指针。

由于*pfds是一个指针,它的大小将为4或8字节,因此我不明白为什么在创建数组时要考虑它的大小。

1个回答

4

sizeof *pfds是结构体的大小,而不是指针的大小。你的两个示例是等效的。我更喜欢第一种形式,因为它更容易维护-如果结构体的类型发生变化,只需在一个位置进行修正。

sizeof pfds将是指针的大小。


1
是的,没错。sizeof *pfds 被解释为“pfds 指向的任何东西的大小”。这样做更好,因为即使 pfds 被重新定义为指向其他内容,代码仍然可以正常工作。(实际上,在您的第二个示例中编写的代码...请放心,有很多这样的代码...在进行此类更改后,可能会出现“一个讨厌的错误!”) - Mike Robinson
很抱歉我浪费了时间。我并不总是这么笨。 - asds_asds
@MikeRobinson 我确实学会了一种编写更好、更安全代码的方法,这很重要。社区真的很有帮助。保持安全,待在家里。 - asds_asds
1
@asds_asds 我同意这个答案,但如果我可以提供一个未被请求的建议,我会说:在sizeof参数周围使用括号。括号是免费的! :) (我知道有人认为这样更易读,但我不同意。每次我看到一个没有用括号括起来的sizeof参数,一只可爱的小猫就死了 :) ) - Roberto Caboni
2
@RobertoCaboni,就我而言,我感觉完全相反。sizeof是一个运算符。多余的括号让我感到难过。虽然没有return(x);那么糟糕,但仍然很悲伤。 - Carl Norum
@CarlNorum https://dev59.com/lbroa4cB1Zd3GeqPdRfS使用-sizeof-运算符时出现意外行为 - Roberto Caboni

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