在提到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个字节。但是,我已经看到它也被普遍使用。
答案 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()
调用更容易。