4

在向 malloc 调用提及结构的大小时,是提及结构的名称还是解除引用的结构指针变量更好?

例子:

struct ExampleStruct
{
  int x;
  char arr[40];
};

int main()
{

  struct ExampleStruct *Y = NULL;

  Y = malloc(sizeof(struct ExampleStruct)); //Is this better?

  Y = malloc(sizeof(*Y)); //Is this better?  

}

我个人更喜欢sizeof(struct ExampleStruct),因为我看到许多开发人员在第二种方法中犯了遗漏“*”的错误,即他们错误地键入它malloc(sizeof(Y)),在这种情况下,分配的内存将只有 4 个字节。但是,我也看到它也被普遍使用。

4

4 回答 4

5

我绝对更喜欢第二个。如果每个声明的类型Y发生变化,该行仍然可以正常工作。

于 2012-05-16T05:11:25.173 回答
4

我查看了 K&R 2nd Edition,发现了 3 个相关的使用示例malloc()

  • 第 142 页:return (struct tnode *) malloc(sizeof(struct tnode));

  • 第 145 页:np = (struct nlist *) malloc(sizeof(*np));

  • 第 146 页:return (Treeptr) malloc(sizeof(Treenode));

没有特别讨论不同的形式。序言中有一条注释“我们广泛使用 Bjarne Stroustrup 的 C++ 翻译器对我们的程序进行本地测试”。这是在 1989 年 C 标准定稿之前编写的(我的副本在封面上有“基于提议的 ANSI C 草案”,所以当时没有标准编译器),这可以解释每次malloc()调用时的显式转换——这些在 C++ 中是必需的。

因此,“创始人”使用了这两种形式。

现代风格是使用sizeof(*variable)符号(并且在 C 中省略强制转换),这样即使变量的类型发生变化,您也不必更改此代码。添加演员表,这种好处就消失了。

Most of my older code tends to use the sizeof(type) notation, in part in emulation of the style in K&R C. Most of my newer code now uses the sizeof(*variable) notation. When I expect to compile the code with C++ as well as C, I put the cast in too.

于 2012-05-16T05:43:36.483 回答
1

我更喜欢:

Y = malloc(sizeof(struct ExampleStruct));

因为,这是数据类型,您可以将其相乘以用于其他目的。前任:

Y = malloc(sizeof(struct ExampleStruct) * 5);

前任:

int *i;

我更喜欢:

i = malloc(sizeof(int));

比,

i = malloc(sizeof(*i);

另外,提醒一下,这个变量i是指向 的指针intY也是指向 的指针struct ExampleStruct

于 2012-05-16T05:37:12.400 回答
1

第二种的典型论点是当 Y 的类型改变时,malloc()仍然有效。但是,通常在语句后面有初始化代码,初始化 Y 的旧类型。如果它仍然适用于新类型,您至少必须检查它。将类型更改为“正常工作”涉及更多计划。

但另外,第二个通常是更少的代码编写和更少的代码稍后阅读。

我更愿意更进一步,在这种情况下使用 Create 和 Destroy 函数。Create 函数不返回 void 指针,而是返回正确的类型。因此,如果 Y 的类型发生了变化,但我没有更改调用(并查看以下初始化代码),那么编译器会给我一个错误。

malloc()另外,这使得资源管理比在代码中随机调用和调用要容易得多free()

于 2012-05-16T05:39:47.597 回答