Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc应该指定指针大小还是内存大小?_C_Linux_Networking - Fatal编程技术网

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

malloc应该指定指针大小还是内存大小?,c,linux,networking,C,Linux,Networking,我正在浏览第45页,写了下面的代码 struct pollfd *pfds = malloc(sizeof *pfds * fd_size); 我在想是不是应该 struct pollfd *pfds = malloc(sizeof(struct pollfd) * fd_size); 因为返回指向指定大小的内存块的指针 由于*pfds是一个指针,它的大小将是4或8字节,因此我无法理解为什么在创建数组时会考虑它的大小。sizeof*pfds是结构的大小,而不是指针的大小。你的两个例子都是等价

我正在浏览第45页,写了下面的代码

struct pollfd *pfds = malloc(sizeof *pfds * fd_size);
我在想是不是应该

struct pollfd *pfds = malloc(sizeof(struct pollfd) * fd_size);
因为返回指向指定大小的内存块的指针


由于*pfds是一个指针,它的大小将是4或8字节,因此我无法理解为什么在创建数组时会考虑它的大小。

sizeof*pfds
是结构的大小,而不是指针的大小。你的两个例子都是等价的。我更喜欢第一种形式,因为它更容易维护——如果结构类型发生变化,您只需在一个位置修复它


sizeof pfds
将是指针的大小。

是的,完全正确
sizeof*pfds
被解释为“任何东西的大小
pfds
指向”。这是最好的,因为即使
pfds
被重新定义为指向其他东西,代码仍然可以工作。(事实上,在第二个示例中编写的代码……请放心,还有大量的代码……经过这样的更改后,可能会是:“一个nas-s-s-s-s-sty错误!”*我为我浪费的时间感到抱歉。我不是一直这么笨。@MikeRobinson我确实学会了一种编写更好、更安全代码的方法,这很重要。社区真的很有帮助。保持安全,呆在家里。@asds\U asds我同意答案,但如果我能提供一条未经请求的建议,我会说:在争论的大小周围使用括号。括号s是免费的!:)(我知道有人认为它更易读,但我不同意。每次我看到一个没有括号的争论,一只可爱的小猫就死了:)@RobertoCaboni,FWIW,我的感觉正好相反
sizeof
是一个运算符。额外的括号让我伤心。没有
返回(x)那么糟糕让我觉得,但还是很难过。