[英]“use of undeclared identifier” when typecasting void pointer to struct pointer
我是C語言的新手,作為(經典)練習,我試圖在鏈接列表上實現一些操作。 但是,我還沒有走的很遠...當我嘗試如下聲明和初始化根節點時:
#include <stdlib.h>
struct intNode_t {
int data;
struct intNode_t* next;
};
int main() {
struct intNode_t* root = ( intNode_t* ) malloc( sizeof( struct intNode_t ) );
return 0;
}
編譯器(clang)在嘗試將malloc返回的void指針轉換為指向intNode_t的指針的地方,給我錯誤“使用未聲明的標識符”。 我意識到這是一個菜鳥問題,但我找不到其他答案。 有什么建議么?
C中的結構名稱與基本類型名稱和typedef的名稱空間無關(請參閱此問題以獲取詳細信息)。 因此,您的結構類型的名稱為struct intNode_t
; 沒有稱為intNode_t
類型。
您可以始終將名稱拼寫為struct intNode_t
,也可以為其創建類型別名。 實際代碼中有許多不同的模式:
單獨的標簽名稱,單獨的聲明:
typedef struct foo_t_ foo_t;
struct foo_t_ { /* ... */ };
這樣,您就可以將類型別名放在標頭中,並將其發布為不透明的API類型,而無需透露實際的類型定義。
單獨的標記名稱,結構定義中的typedef:
typedef struct foo_t_ { /* ... */ } foo_t;
重用名稱:
typedef struct foo_t { /* ... */ } foo_t;
這種樣式使用戶foo_t
擔心拼寫foo_t
或struct foo_t
。
不要命名結構:
typedef struct { /* ... */ } foo_t;
但是,在代碼中,您實際上不需要重復名稱,因為您不應該malloc
轉換malloc
的結果,而是依靠從void指針到對象指針的內置隱式轉換。 您也不應重復已知的類型,而應使用sizeof
的表達式形式。 所以你要:
int main()
{
struct intNode_t* root = malloc(sizeof *root);
}
(還要注意,從main
隱含return 0
)
無需重復自己。 如果您不重復自己,則可以減少錯誤。
struct intNode_t *root;
root = malloc( sizeof *root );
malloc()
返回一個void*
,它可以與每種(非函數)指針類型互換。 sizeof(type)
和sizeof expression
第一個需要()
,第二個不需要。 大多數人都喜歡第二種形式,因為表達式(在您的情況下為*root
)總是會產生正確的類型,因此:size。 並且,上面的定義+賦值可以組合為一個定義+初始化程序,所有這些都適合於一行:
struct intNode_t *root = malloc( sizeof *root );
intNode_t
中未聲明名稱intNode_t
。 聲明了結構標簽名稱intNode_t
。
所以你需要寫
struct intNode_t* root = ( struct intNode_t* ) malloc( sizeof( struct intNode_t ) );
或者您可以通過以下方式引入標識符名稱intNode_t
typedef struct intNode_t {
int data;
struct intNode_t* next;
} intNode_t;
在這種情況下,您可以寫
struct intNode_t* root = ( intNode_t* ) malloc( sizeof( struct intNode_t ) );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.