簡體   English   中英

當將void指針類型轉換為結構指針時,“使用未聲明的標識符”

[英]“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_tstruct 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有兩種語法變體: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM