声明和定义结构体需要注意的问题
生活随笔
收集整理的這篇文章主要介紹了
声明和定义结构体需要注意的问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、為什么不能在聲明 結(jié)構(gòu)體的時(shí)候直接給成員變量賦聲明?(1)聲明變量uint8_t ?i;(2)聲明函數(shù)void func(void);(3)聲明變量類型typedef ?int int32_t(4)結(jié)構(gòu)體的聲明struct Node{uint8_t ?i;uint32_temp;};(5)聯(lián)合體的聲明union Test{uint8_t ?i;uint32_temp;};問題分析:在上面聲明的過程中,所有看似din定義的東西都不能被賦值,因?yàn)樗鼈冎皇窍蛴?jì)算機(jī)說明了一下,我有這么個(gè)東西,而不是真正的定義。如果你進(jìn)行了定義,那么要么被忽略,要么就警告甚至報(bào)錯(cuò)。一定要能區(qū)分聲明和定義。聲明的時(shí)候,計(jì)算機(jī)沒有為它分配空間,只有定義了,才有空間。所以你是無法為沒有空間的東西賦值的。例如下面這種寫法:struct Node{uint8_t ?i = 10;uint32_temp = 5;};就是不合法的。因?yàn)榇藭r(shí)只是聲明,沒有定義變量,自然沒空間,所以這種寫法不合法。要給i和temp賦值,必須有結(jié)構(gòu)體變量,例如寫成:第一種方法:struct Node{uint8_t ?i ;uint32_temp;};struct Node node;node.i=10;node.temp = 5;第二種方法:struct Node{uint8_t ?i ;uint32_temp;}node;node.i = 10;node.temp=5;以上兩種寫法,都是合法的。2、結(jié)構(gòu)體里為什么不能定義自己,而只能定義自己的指針?如果寫成:struct Node{uint8_t data;struct Node next;};那么你會(huì)發(fā)現(xiàn),這個(gè)結(jié)構(gòu)體將會(huì)不知道自己有多大。如果我們用它定義了一個(gè)變量:struct Node node;那么,這個(gè)node里有個(gè)next,也就是node.next,node.next里還有個(gè)next,以此類推,node.next.next.next.next……無窮無盡了。所以這樣的結(jié)構(gòu)會(huì)導(dǎo)致計(jì)算機(jī)無法判斷它的大小。而如果我們寫成指針:struct Node{uint8_t data;struct Node *next;};那么任何指針的大小都是一定的(32位編譯器下是4字節(jié),64位編譯器下是8字節(jié)),所以這個(gè)結(jié)構(gòu)體可以確定大小。如果我們用它定義了一個(gè)變量:struct Node node;那么此時(shí),node.next是野指針,在你給它分配空間之前,node.next->next是不存在的,所以它的存在是合法的。
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的声明和定义结构体需要注意的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工程师必看-PCB设计标准工艺要求(五)
- 下一篇: 三极管的开关特性