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);'。 –