struct node *tempNode = (struct node*) malloc(sizeof(struct node));
//and
struct node *tempNode = malloc(sizeof(struct node));
回答
struct node *tempNode = (struct node*) malloc(sizeof(struct node));
你动态分配空间给一个节点指针tempNode和类型转换它是一个结构节点*类型。 (指针结构)
struct node *tempNode = malloc(sizeof(struct node));
与上面相同,除了没有明确的类型转换(结构节点*)
没有区别。由于malloc
返回类型void *
,因此可以将其分配给任何指针类型的变量而无需强制转换。正如John Bode所提到的,投射malloc
的结果被认为是不好的做法,因为它可能会掩盖由于具有malloc
的其他定义而导致的编译器错误。
既然你正确地铸造它,两者之间没有区别。
但是因为可以将void*
隐式转换为任何其他(数据)指针类型,所以在C中一般不赞成。
也看到这款C FAQ条目:What's wrong with casting malloc's return value?
一个第三人在那里:
struct node *tempNode = malloc(sizeof *tempNode);
,这是更好,因为它使在案件类型改变较少的变化。
是不是第一句矛盾说在链接? –
@EugeneSh。对于所有其他相关问题,我都包含链接*。如果你正在谈论“忘记包含..”,它不是一个有效的C程序(隐式int不再被允许)。任何体面的编译器都会为此发出警告。我没有看到来自OP的完整代码。所以,我假设OP包括它。对于我所知道的,如果你想达到挑剔的级别,可能会有'#define malloc NULL'。 – usr
假设第一个评论者是downvoter是* Post hoc ergo propter hoc *。这不是一个挑剔的问题。投射“malloc”的结果是众所周知的“不 - no”。 –
通过调用malloc
,分配的内存大小为struct node
(以字节为单位)。它将void*
返回给分配的内存。
现在的事情是:你的两行完全一样,但第二行在编译C++编译器时会导致警告。
C允许将void*
隐式转换为不同的指针类型,而C++编译器会 - 至少 - 警告你,或给你一个错误。
这不是一个C++问题,或者java,C#,B * f等。 –
@WeatherVane所以你有什么意思?在C中,显然没有区别,但是提问者很可能想知道这一点,C++与C相比其他任何东西都更相关。 – maxdev
我很抱歉,但C++不在桌面上,不管你认为它有多“相关”。在C中,如果你认为“显然没有区别”,那么你还没有阅读[链接已发布](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) 。我被诱惑到DV,但给了你回收答案的机会。 –
- 1. 这两行之间有什么区别?
- 2. 这两行有什么区别?
- 3. 这两行有什么区别?
- 4. 这两个类有什么区别?
- 5. 这两个Coffeescript有什么区别?
- 6. 这两个SQL有什么区别?
- 7. 这两个main.m有什么区别?
- 8. 这两个命令有什么区别?
- 9. 这两种方法有什么区别
- 10. 这两个代码有什么区别?
- 11. 这两个声明有什么区别?
- 12. 这两个查询有什么区别?
- 13. 这两种配置有什么区别?
- 14. 这两个陈述有什么区别?
- 15. 这两个声明有什么区别?
- 16. 这两个....之间有什么区别?
- 17. 这两个ViewController Pushes有什么区别?
- 18. 这两个查询有什么区别?
- 19. 这两个实现有什么区别?
- 20. 这两个按钮有什么区别?
- 21. 这两条语句有什么区别?
- 22. XSD:这两者有什么区别?
- 23. 这两条语句有什么区别
- 24. 这两个定义有什么区别?
- 25. 这两个数组有什么区别?
- 26. 这两个代码有什么区别
- 27. 这两个typedefs有什么区别?
- 28. 这两个查询有什么区别
- 29. 这两个声明有什么区别?
- 30. 这两个java有什么区别arrayList.add()
'(struct node *)'由于malloc返回一个void指针而导致编译错误消失。 – Ultimater
@Ultimater在C中不会有任何警告。参见http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –
C中第一种被认为是不好的实践;自C90标准以来,您并不需要明确地指定'malloc'的返回值,并且在此标准下可以抑制有用的诊断。而写一个更好的方法是'struct node * tempNode = malloc(sizeof * tempNode);'。 –