最近在我的导师关于链表的讲座中,他这样声明它们:
struct asd *head=(struct asd *)malloc(sizeof(struct asd));
我想知道上面的声明与此有什么区别:
struct asd *head=malloc(sizeof(struct asd));
因为我一直在为我制作的每个链接列表使用后者。顺便说一句,语言是C。
最近在我的导师关于链表的讲座中,他这样声明它们:
struct asd *head=(struct asd *)malloc(sizeof(struct asd));
我想知道上面的声明与此有什么区别:
struct asd *head=malloc(sizeof(struct asd));
因为我一直在为我制作的每个链接列表使用后者。顺便说一句,语言是C。
基本上没有区别,问题是malloc
返回 a void *
,然后可以将其设置为 C 中的任何其他指针类型,在 C++ 中,它需要像最初那样进行显式类型转换,在 C 中,它不赞成对 malloc 的返回进行类型转换。
因此,您的导师可能最初学习的是 C++,然后是 C,这实际上在现在很常见。
以下是正常的,在使用 C 时推荐:
struct asd *head = malloc(sizeof(*head));
建议使用sizeof(*head)
而不是,sizeof(struct asd)
因为它减少了拼写错误,尤其是在重构代码时。两者在其他方面是等价的。
不建议使用 return malloc
,因为这没有积极作用。在某些情况下,强制转换 的结果会malloc
产生负面影响,因为当您忘记包含<stdlib.h>
.
脚注:强制转换结果的唯一合理原因malloc
是您可以编写同时使用 C 和 C++ 的代码。但是请不要编写既是 C 又是 C++ 的代码,这有点疯狂。
真的没有什么区别。Malloc 分配特定大小的内存(结构 asd 的字节数)。这两种情况都会发生。不同之处在于指针(只是一个内存地址)在第一个示例中被强制转换,而不是在第二个示例中强制转换。
投射指针实际上并没有“做任何事情”。它是一种语法糖,旨在使您(和编译器)更容易以特定方式思考指针。同样,在此示例中,它没有任何区别。
我个人更喜欢您的讲师使用的第一种方法,因为它是明确的。您明确表示 malloc 返回的内存地址指向 a struct asd
。尽管在内部,指针是指针是指针。在 C 语言中,显式几乎总是一件好事。
malloc()
返回一个 void 指针,在 C 中,可以将 void 指针分配给任何指针,而无需显式强制转换。#1
所以不需要像这样的显式 cast( )。
事实上,一些程序员会建议避免使用 cast( #2
) 来避免模糊的可用性错误。
如果您忘记包含stdlib.h
. 编译器将假定这malloc()
是一个返回的函数int
,并将由于显式转换而将返回的指针void*
转换为。在某些平台上,an 的大小和指针的大小可能不同,因此这种不希望的类型转换可能会导致数据损坏。malloc()
int
int
就个人而言,我认为这不是一个很大的原因,而是与古老的尤达条件相似的哲学。
malloc 返回一个 void* 指针,因此您的讲师使用了正确的语法并显式转换为正确的类型。您所做的工作有效,因为编译器会自动为您转换它。我假设您使用了 MSVC,因为 GCC 会警告您这一点(我认为)。