2016-11-22 56 views
0
struct node *tempNode = (struct node*) malloc(sizeof(struct node)); 

//and 

struct node *tempNode = malloc(sizeof(struct node)); 
+0

'(struct node *)'由于malloc返回一个void指针而导致编译错误消失。 – Ultimater

+1

@Ultimater在C中不会有任何警告。参见http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

+2

C中第一种被认为是不好的实践;自C90标准以来,您并不需要明确地指定'malloc'的返回值,并且在此标准下可以抑制有用的诊断。而写一个更好的方法是'struct node * tempNode = malloc(sizeof * tempNode);'。 –

回答

0
struct node *tempNode = (struct node*) malloc(sizeof(struct node)); 

你动态分配空间给一个节点指针tempNode和类型转换它是一个结构节点*类型。 (指针结构)

struct node *tempNode = malloc(sizeof(struct node)); 

与上面相同,除了没有明确的类型转换(结构节点*)

0

没有区别。由于malloc返回类型void *,因此可以将其分配给任何指针类型的变量而无需强制转换。正如John Bode所提到的,投射malloc的结果被认为是不好的做法,因为它可能会掩盖由于具有malloc的其他定义而导致的编译器错误。

0

既然你正确地铸造它,两者之间没有区别。

但是因为可以将void*隐式转换为任何其他(数据)指针类型,所以在C中一般不赞成。

也看到这款C FAQ条目:What's wrong with casting malloc's return value?

一个第三人在那里:

struct node *tempNode = malloc(sizeof *tempNode); 

,这是更好,因为它使在案件类型改变较少的变化。

+0

是不是第一句矛盾说在链接? –

+0

@EugeneSh。对于所有其他相关问题,我都包含链接*。如果你正在谈论“忘记包含..”,它不是一个有效的C程序(隐式int不再被允许)。任何体面的编译器都会为此发出警告。我没有看到来自OP的完整代码。所以,我假设OP包括它。对于我所知道的,如果你想达到挑剔的级别,可能会有'#define malloc NULL'。 – usr

+1

假设第一个评论者是downvoter是* Post hoc ergo propter hoc *。这不是一个挑剔的问题。投射“malloc”的结果是众所周知的“不 - no”。 –

-1

通过调用malloc,分配的内存大小为struct node(以字节为单位)。它将void*返回给分配的内存。

现在的事情是:你的两行完全一样,但第二行在编译C++编译器时会导致警告。

C允许将void*隐式转换为不同的指针类型,而C++编译器会 - 至少 - 警告你,或给你一个错误。

+0

这不是一个C++问题,或者java,C#,B * f等。 –

+0

@WeatherVane所以你有什么意思?在C中,显然没有区别,但是提问者很可能想知道这一点,C++与C相比其他任何东西都更相关。 – maxdev

+0

我很抱歉,但C++不在桌面上,不管你认为它有多“相关”。在C中,如果你认为“显然没有区别”,那么你还没有阅读[链接已发布](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) 。我被诱惑到DV,但给了你回收答案的机会。 –