0

最近在我的导师关于链表的讲座中,他这样声明它们:

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

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

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

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

4

5 回答 5

2

基本上没有区别,问题是malloc返回 a void *,然后可以将其设置为 C 中的任何其他指针类型,在 C++ 中,它需要像最初那样进行显式类型转换,在 C 中,它不赞成对 malloc 的返回进行类型转换。

因此,您的导师可能最初学习的是 C++,然后是 C,这实际上在现在很常见。

于 2012-09-14T05:00:58.423 回答
1

以下是正常的,在使用 C 时推荐:

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

  2. 不建议使用 return malloc,因为这没有积极作用。在某些情况下,强制转换 的结果会malloc产生负面影响,因为当您忘记包含<stdlib.h>.

请参阅:我是否强制转换 malloc 的结果?

脚注:强制转换结果的唯一合理原因malloc是您可以编写同时使用 C 和 C++ 的代码。但是请不要编写既是 C 又是 C++ 的代码,这有点疯狂。

于 2012-09-14T05:00:32.203 回答
0

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

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

我个人更喜欢您的讲师使用的第一种方法,因为它是明确的。您明确表示 malloc 返回的内存地址指向 a struct asd。尽管在内部,指针是指针是指针。在 C 语言中,显式几乎总是一件好事。

于 2012-09-14T05:03:59.640 回答
0

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

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

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

就个人而言,我认为这不是一个很大的原因,而是与古老的尤达条件相似的哲学。

于 2012-09-14T05:04:04.773 回答
0

malloc 返回一个 void* 指针,因此您的讲师使用了正确的语法并显式转换为正确的类型。您所做的工作有效,因为编译器会自动为您转换它。我假设您使用了 MSVC,因为 GCC 会警告您这一点(我认为)。

于 2012-09-14T04:59:48.310 回答