2015-04-16 70 views
0

我以下錯誤:功能的指針:會員參考基本類型(...)不是一個結構或聯合

"error: member reference base type 'start' (aka 'struct no_start *') is not a structure or union".

所以,我有很多的結構,如:

typedef struct no_start * start; 

struct no_start{ 
    prog * node_program; 
}; 

而且功能是這樣的:

start * insert_start(prog * program){ 

    start * data = (start *) malloc(sizeof(start)); 

    data->node_program = program; 

    return data; 

} 

我有一個文件functions.c哪裏像這樣簡單的功能都在,文件structs.h,其中結構是和最後的functions.h,我聲明瞭我的第一個文件的功能。

我不明白爲什麼我有這個錯誤。對於每個功能,我都會得到與指定一樣多的錯誤。

+1

'data'是一個指向指針,寫'開始數據=(開始)的malloc(...'用C代替 – Columbo

+0

你不投'malloc',這是什麼語言? –

+0

如果我不投它或如果我只寫了開始(沒有「*」)我得到這個 >「警告:不兼容的指針類型返回'開始' (又名'struct no_start *')從結果類型爲'start *'的函數(又名 'struct no_start **');將地址與& [-Wincompatible-pointer-types] return data;「 – MiguelVeloso

回答

0

我的錯誤是使結構的指針。

typedef struct no_start * start;

相反,我需要typedef struct no_start start;

0

您不需要鍵入類別malloc的返回值。這樣做會創建一個指針,指向一個指針。凡作爲非鑄造malloc調用會返回一個指向分配給你的結構

0

記憶我不會做

typedef struct no_start * start; 

即typedef的東西作爲一個指向結構沒有做

  • 一個結構體本身
  • 的類型定義命名指針的typedef像start_ptr

否則人們會感到困惑。就像你自己一樣。

start * data = (start *) malloc(sizeof(start)); 

假設啓動是一個結構 - 它沒有。你的意思是

start data = malloc(sizeof(struct no_start)); 

更好的是

typedef struct no_start{ 
    prog * node_program; 
} start; 

typedef start * start_ptr; 

    start_ptr data = malloc(sizeof(start)); 
+0

我試過了,同樣的錯誤! – MiguelVeloso

+0

我哈我的typedef錯誤的方式再試一次 – pm100

0

展開的typedef,你會看到什麼地方出了錯:

struct no_start ** data = (struct no_start **) malloc(sizeof(struct no_start*)); 
data->node_program = program; // Nope; *data is a pointer 

你可以使用

start data = malloc(sizeof(*data)); 
data->node_program = program; 

但它通常是最好避免使用「指針類型定義」,除非可能用於不透明類型(即,隱藏結構定義的地方)。

如果你不喜歡打字struct無處不在(這是不必要的C++),你可以的typedef的結構:

typedef struct no_start no_start; 

no_start* insert_start(prog* program){ 
    no_start* data = malloc(sizeof(*data)); 
    data->node_program = program; 
    return data; 
} 

當然,在C++中,你應該使用new,不malloc

相關問題