C中链表声明的区别

时间:2012-09-14 04:57:13

标签: c casting linked-list malloc

最近在我的导师关于链接列表的讲座中,他宣称他们是这样的:

struct asd *head=(struct asd *)malloc(sizeof(struct asd));

我想知道上面的声明与此相比有什么区别:

struct asd *head=malloc(sizeof(struct asd));

因为我一直在为我制作的每个链表使用后者。顺便说一句,语言是C。

5 个答案:

答案 0 :(得分:2)

从根本上说没有区别,问题是malloc返回void *然后可以设置为C中的任何其他指针类型,在C ++中它需要一个显式的类型转换,因为它最初完成在C语言中,他们不屑于从malloc那里回归。

所以你的导师可能最初学过C ++然后是C,这实际上现在很常见了。

答案 1 :(得分:1)

以下是正常的,建议使用C:

struct asd *head = malloc(sizeof(*head));
  1. 建议使用sizeof(*head)代替sizeof(struct asd),因为它可以减少拼写错误,尤其是在重构代码时。这两者在其他方面是等价的。

  2. 建议不要强制转换malloc,因为这没有任何积极影响。在某些情况下,转换malloc的结果会产生否定效果,因为当您忘记包含<stdlib.h>时,它可以抑制C99前消息的错误消息。

  3. 请参阅:Do I cast the result of malloc?

    脚注:投射malloc结果的唯一合理理由是,您可以编写同时使用C和C ++的代码。但请不要编写兼容C和C ++的代码,这有点疯狂。

答案 2 :(得分:0)

malloc返回一个void *指针,因此您的讲师使用了正确的语法并明确地转换为正确的类型。你正在做什么工作,因为编译器自动为你转换它。我假设您使用了MSVC,因为GCC会警告您(我认为)。

答案 3 :(得分:0)

没有什么区别。 Malloc分配特定大小的内存(struct asd的字节数)。这两种情况都会发生。不同之处在于指针(它只是一个内存地址)在第一个例子中强制转换,而不是在第二个例子中强制转换。

投射指针实际上并没有“做任何事情”。它是语法糖,旨在使您(和编译器)更容易以特定方式考虑指针。同样,在这个例子中,它没有任何区别。

我个人更喜欢你的讲师使用的第一种方法,因为它是明确的。您明确地说malloc返回的内存地址指向struct asd。虽然在内部,指针是指针是一个指针。明确在C中几乎总是一件好事。

答案 4 :(得分:0)

malloc()返回一个void指针,在C中,可以将void指针分配给任何没有显式强制转换的指针。所以不需要显式的强制转换(#1)。

事实上,一些程序员会建议避免使用强制转换(#2)以避免模糊的可用性错误。

如果您忘记加入stdlib.h。编译器将假定malloc()是一个返回int的函数,并且由于显式强制转换,会将void*返回的malloc()指针转换为int。在某些平台上,int的大小和指针大小可能不同,因此这种不需要的类型转换可能会导致数据损坏。

就我个人而言,我没有找到这么多原因,而是与年龄相仿的 Yoda condition