結構體型別重宣告導致的bug乙個

2021-09-07 11:58:20 字數 1232 閱讀 5273

bug前提條件

當模組比較多。標頭檔案較多,某個結構體型別會在當前模組中又一次宣告進而引用其成員,而不直接包括其它模組的標頭檔案。

已知兩個模組a和b。同乙個結構型別struct node在兩個模組中分別宣告。當中b模組無意或者有意調整了結構型別中的某些域。那麼這個時候。若b模組中引用a模組中此型別例項然後訪問成員變數,就會引發bug!

例如以下重現演示樣例

bug重現演示樣例**

modulea.c

#include struct node;

//定義測試變數

struct node new = ;

//測試輸出

extern test_output(void);

void output(void)

int main(int argc, char *ar**)

moudleb.c

#include //這裡又一次宣告,調整域的順序

struct node;

//引用modulea中的new例項

extern struct node new;

void test_output(void)

makefile

run: modulea.o moduleb.o

cc -o run modulea.o moduleb.o

執行結果:

結果分析:

在模組b中,對name的訪問偏移量計算是根據本模組中的宣告決定的。name的偏移量是4!

同理。在模組a中,name的偏移量是0.在模組b中訪問模組a中例項new時,

依照偏移量4計算。得到的確是data的值。顯然為null。

解決的方法:

建議辦法

1-往上提公升;公共的型別宣告。定義成乙個全域性性的標頭檔案,多個模組共同使用。而不隸屬與不論什麼一方,避免交織

2-合作協商;兩個模組的絕對一致。即一方改變(比方增刪成員。或者改網域名稱),必須通知還有一方

3-模組介面化。假設外面模組須要訪問本模組的例項。那麼本模組應該提供介面。而不是讓其它模組直接訪問自己模組的例項!這樣是最理想的。

也符合高內聚,低耦合原則。

個人認為(3)是最理想的解決的方法。

結構體型別變數的宣告方式

1.本文講述一下結構體變數的宣告方式 2.如下 include typedef structbook 這裡的book為單純的節點,但是 linklist則為乙個指標型別 int main 測試資料 0001 計算機網路 23 0002 資料結構 34 3.常見錯誤定義方式 1 錯誤定義方式1 boo...

結構體的優化宣告

宣告乙個結構體的時候,因為考慮到記憶體的對齊。例如,int型的變數,需要4個位元組,那麼它在儲存的時候就需要在位址能夠被4個位元組整除的地方開始申請。例如我們申請下面這樣的乙個結構體 struct node1 在記憶體分配的時候,char佔乙個位元組,int 佔四個位元組。c語言在進行記憶體分配的時...

結構體的優化宣告

宣告乙個結構體的時候,因為考慮到記憶體的對齊。例如,int型的變數,需要4個位元組,那麼它在儲存的時候就需要在位址能夠被4個位元組整除的地方開始申請。例如我們申請下面這樣的乙個結構體 struct node1 在記憶體分配的時候,char佔乙個位元組,int 佔四個位元組。c語言在進行記憶體分配的時...