我在阅读Beej的网络编程指南时,在第45页发现了以下代码片段:
struct pollfd *pfds = malloc(sizeof *pfds * fd_size);
我在想,它该是这样吗?
struct pollfd *pfds = malloc(sizeof(struct pollfd) * fd_size);
由于malloc返回指向指定大小内存块的指针。
由于*pfds是一个指针,它的大小将为4或8字节,因此我不明白为什么在创建数组时要考虑它的大小。
我在阅读Beej的网络编程指南时,在第45页发现了以下代码片段:
struct pollfd *pfds = malloc(sizeof *pfds * fd_size);
我在想,它该是这样吗?
struct pollfd *pfds = malloc(sizeof(struct pollfd) * fd_size);
由于malloc返回指向指定大小内存块的指针。
由于*pfds是一个指针,它的大小将为4或8字节,因此我不明白为什么在创建数组时要考虑它的大小。
sizeof *pfds
是结构体的大小,而不是指针的大小。你的两个示例是等效的。我更喜欢第一种形式,因为它更容易维护-如果结构体的类型发生变化,只需在一个位置进行修正。
sizeof pfds
将是指针的大小。
sizeof *pfds
被解释为“pfds
指向的任何东西的大小”。这样做更好,因为即使pfds
被重新定义为指向其他内容,代码仍然可以正常工作。(实际上,在您的第二个示例中编写的代码...请放心,有很多这样的代码...在进行此类更改后,可能会出现“一个讨厌的错误!”) - Mike Robinsonsizeof
是一个运算符。多余的括号让我感到难过。虽然没有return(x);
那么糟糕,但仍然很悲伤。 - Carl Norum