2017-09-05 104 views
20

我在.H如何讓gcc警告未定義的結構?

struct buf_stats { 
    // *** 
}; 

限定的結構然後在.c文件

struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ; 

其中buf_states是一個錯字。

但GCC不提醒我,雖然我以前-Wall

和這個bug /錯字我花了3個小時找到。

如何使gcc警告未定義的結構像這樣?

+0

嘿?你得到的錯誤信息是什麼? –

+0

@SouravGhosh我認爲沒有錯誤信息,這是OP詢問的。 – Yunnosch

+17

竇想給malloc足夠的空間作爲指針嗎?編譯器並不真正需要它指向的大小。或者你想malloc的結構?在這種情況下,還有另一個錯字,第二個「*」。 – Yunnosch

回答

36

在你的代碼

struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ; 

是錯誤的原因有很多,像

  • 您使用的是未定義的類型(如你所提到的)
  • 您分配方式較少的內存(分配的一個指針類型而不是類型

但你編譯器不能幫助很多在_this_case這個特定類型的錯誤,如

  • 指針(任何)類型在一個平臺上有一個定義的大小,該結構(即它指向的變量類型)不需要完整(定義爲)。這就是我們可以擁有自引用結構的原因,對吧?

  • malloc()對目標變量類型不瞭解。它只是讀取所需大小的參數,將指針(類型爲void *)返回給分配的內存,並在賦值後將其更改爲目標類型。它不可能用分配的內存大小計算目標大小(類型)中的不匹配

最方便,最簡單的方法,以避免這些類型的錯誤是,不要直接使用硬編碼類型的sizeof操作數,而是使用變量引用。

喜歡的東西

struct buf_stats *bs = malloc(sizeof *bs) ; // you can write that as (sizeof (*bs)) also 
              // sizeof *bs === sizeof (struct buf_stats) 

這相當於

struct buf_stats *bs = malloc(sizeof(struct buf_stats)) ; 

但是更強大和更不容易出錯。

注:

  1. 如果操作數不是類型名稱你不需要括號。
  2. 此聲明在更改目標變量bs的類型後無需進行任何修改。
+2

可能值得一提的是'sizeof * bs'中的'*'不*表示一個指針,而是一個取消引用。 'bs'是一個指針,所以'* bs'是結構體本身的值,在這裏調用sizeof。 – tomsmeding

+0

此外,註釋1還是不錯的,因爲如果'struct but_stats'沒有完成,或者'bs'是類型名稱而不是變量名稱,它實際上會產生類似於@Sato要求的錯誤。 – Leushenko

+1

我見過指向不同尺寸的東西的指針是不同大小的平臺。 (void *是指向任何數據類型的最大指針,以使其工作。) – Joshua

17

你不能。使用類似struct foo *(指向某種結構類型的指針)的表達式聲明該結構爲不完整類型。尺寸未知,但對於指針的尺寸沒有必要。

這就是說,代碼看起來錯誤的,因爲你需要的大小結構的指針的大小),所以用下面的代碼:

struct buf_stats *bs = malloc(sizeof(struct buf_states)); 

,你會得到一個錯誤

有寫這樣的代碼有更好的方式:

struct buf_stats *bs = malloc(sizeof *bs); 

表達*bs具有正確的類型sizeof,即使您以後更改類型。