宣告和定義結構體需要注意的問題

2021-09-24 02:37:00 字數 1188 閱讀 5611

1、為什麼不能在宣告 結構體的時候直接給成員變數賦宣告?

(1)宣告變數

uint8_t  i;

(2)宣告函式

void func(void);

(3)宣告變數型別

typedef  int int32_t

(4)結構體的宣告

struct node;

(5)聯合體的宣告

union test;

問題分析:

在上面宣告的過程中,所有看似din定義的東西都不能被賦值,因為它們只是向計算機說明了一下,我有這麼個東西,而不是真正的定義。如果你進行了定義,那麼要麼被忽略,要麼就警告甚至報錯。一定要能區分宣告和定義。宣告的時候,計算機沒有為它分配空間,只有定義了,才有空間。所以你是無法為沒有空間的東西賦值的。例如下面這種寫法:

struct node;

就是不合法的。因為此時只是宣告,沒有定義變數,自然沒空間,所以這種寫法不合法。

要給i和temp賦值,必須有結構體變數,例如寫成:

第一種方法:

struct node;

struct node node;

node.i=10;

node.temp = 5;

第二種方法:

struct nodenode;

node.i = 10;

node.temp=5;

以上兩種寫法,都是合法的。

2、結構體裡為什麼不能定義自己,而只能定義自己的指標?

如果寫成:

struct node

;那麼你會發現,這個結構體將會不知道自己有多大。如果我們用它定義了乙個變數:

struct node node;

那麼,這個node裡有個next,也就是node.next,node.next裡還有個next,以此類推,node.next.next.next.next……無窮無盡了。所以這樣的結構會導致計算機無法判斷它的大小。

而如果我們寫成指標:

struct node

;那麼任何指標的大小都是一定的(32位編譯器下是4位元組,64位編譯器下是8位元組),所以這個結構體可以確定大小。如果我們用它定義了乙個變數:

struct node node;

那麼此時,node.next是野指標,在你給它分配空間之前,node.next->next是不存在的,所以它的存在是合法的。

結構體宣告和定義

1.宣告乙個命名結構體 struct student 定義乙個變數 struct student lily 給結構體起別名 typedef struct student student t 2.宣告乙個命名結構體並定義乙個變數 struct student lily 3.宣告乙個未命名結構體並定義乙...

需要注意的問題

決策樹id3和c4.5的差別?各自優點?boost演算法 cart 回歸樹用平方誤差最小化準則,分類樹用基尼指數最小化準則 gbdt與隨機森林演算法的原理以及區別。優化演算法中常遇到的kkt條件?作用是?最近鄰演算法knn 分類與回歸 l1和l2函式?l1和l2正則項的比較,如何解決 l1 求導困難...

自定義Cell需要注意的問題

使用xib建立cell時需要在設定單元格樣式時使用 nsbundel mainbundel loadnibname xib的檔名 owner self option nil 0 來初始化單元格 而使用純手寫 時,需要使用init方法來初始化cell上的控制項,來避免單元格重影問題,而xib不會出現重...