sizeof(struct ExampleStruct)或sizeof(* VarExampleStruct) - 哪种编码方法更好?

时间:2012-05-16 05:07:48

标签: c structure

在提到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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

我查看了K& R第2版,找到了使用malloc()的3个相关示例:

  • 第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的草案,因此当时没有标准编译器),这可以解释每个{{{ 1}}调用 - 这些在C ++中是必需的。

所以,'创始人'使用了两种形式。

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

我的大多数旧代码都倾向于使用sizeof(*variable)表示法,部分用于模拟K& R C中的样式。我的大多数新代码现在都使用sizeof(type)表示法。当我希望用C ++和C编译代码时,我也把演员阵容。

答案 2 :(得分:1)

我更喜欢:

Y = malloc(sizeof(struct ExampleStruct));

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

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

例如:

int *i;

我更喜欢:

i = malloc(sizeof(int));

比,

i = malloc(sizeof(*i);

此外,作为提醒,此变量i是指向int的指针,Y是指向struct ExampleStruct的指针。

答案 3 :(得分:1)

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

但另外,第二种方法通常是编写的代码更少,以及稍后可以阅读的代码更少。

我更倾向于更进一步,并为这种情况使用创建和销毁功能。 Create函数不返回void指针,但返回正确的类型。因此,如果Y的类型发生变化,但我没有更改调用(并查看以下初始化代码),那么编译器会给我一个错误。

另外,这使得资源管理比在代码中抛出随机malloc()free()调用更容易。