linux結構體
Ⅰ 淺談結構體及linux下內存分配原則
淺談結構體及linux下內存分配原則結構體在程序中的應用是很廣泛的,要處理的問題越復雜,數據量越多月雜,就越需要用到結構體。比如網路,內核,驅動等等。熟練使用結構體對每個程序員都是至關重要的。一個好的結構體不僅能使程序體系結構清晰,而且使得操作靈活,可擴展性強。linux網路之所以很強大,這和它里設計合理的數據結構有很大關系。
www.shiwu.com
結構體定義:[cpp]<span
style=font-size:18px;>struct
a{
int
xx:4;
int
yy:4;
};</span>
結構體初始化:方式一:[cpp]<span
style=font-size:18px;>struct
a
aa
={
xx:2,
yy:3
};</span>
www.shiwu.com
方式二:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=6,
.yy=1,
};</span>
方式三:[cpp]<span
style=font-size:18px;>struct
a
dd={4,2};</span>
在定義中,可以限制變數的位的作用域,比如上面的:int
xx:4;這表明xx的有效域只有4位,也就是能給他賦值的最大值為15,如果超過這個值,編譯器就會報錯:warning:
overflow
in
implicit
constant
conversion。在這里如果你給xx賦值為15,如:[cpp]<span
style=font-size:18px;>struct
a
cc
={
.xx=15,
.yy=1,
};</span>
www.shiwu.com
然後輸出:[cpp]<span
style=font-size:18px;>printf(cc.xx
=
%d/n,cc.xx);</span>
結果會是:-1因為這里定義的xx為int
型,15的二進制位1111,最高位為1,表示為負數,所以取反加1後為0001。所以是-1。這種位域操作的好處是當你不需要用到你定義的類型的長度時,可以加位域操作以節省內存空間。引出的其他問題這里用sizeof(struct
a)得到的是4,如果不加位域限制則是8,至於為什麼是4呢?4bit+4bit應該剛好是1byte啊,應該是1才對啊。這是因為我是在linux下編譯執行的,而在linux對內存分配最小值為類型值的一半。(我在linux下做了實驗)如下我定義了一個結構體:[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:2;
short
int
yy:2;
}bb;</span>
如上,我定義二個short
int類型值,short
int在32位linux下為2位元組,這里二個相加不足一位元組,但是輸出sizeof(struct
a)的值為2。不足一位元組系統自動補滿一位元組。[html]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:2;
}bb;</span>
www.shiwu.com
這個輸出也是2。xx超過一位元組,但是9+2=11,還沒有超過16(2位元組),我猜系統將xx超過的那1bit分到了yy那1bit裡面了。[cpp]<span
style=font-size:18px;>struct
a{
short
int
xx:9;
short
int
yy:9;
}bb;</span>
這個輸出是4。9+9=18,超過了16,系統各分配了2位元組給xx和yy。作者
linuxblack125125
Ⅱ linux下怎麼查看某個結構體的定義
Linux下查看結構體、變數、函數的定義可以用一款Windows上的軟體叫做Source Insight,這個軟體在Linux的Wine環境中運行的非常好,是少數可以在Linux平台正常運行的Windows應用,這個軟體最大的作用就是瀏覽代碼,可以很容易的跳轉到變數、函數、結構體、類的定義處,特別是代碼項目比較龐大時就更能夠顯示出它的好處了。
Ⅲ Linux驅動程序簡單結構體
這應該是定義一個結構體,並初始化。Linux驅動中經常有這種形式。
比如聲明了一個這樣的結構體
struct num
{
int max;
int min;
};
然後有如下定義
static struct num mynum = {
.max = 5,
.min = 1,
};
這就意味著定義了一個叫做mynum的結構體,mynum.max初始化為5,mynum.min初始化為1。
當然也可以這么寫:
static struct num mynum;
mynum.max = 5;
mynum.min = 1;
兩種寫法一個意思。
Ⅳ linux下如何查看結構體成員
從網路知道搜到的方法。
1 cd /usr/include
2 ctags -R
3 vim -t 標識符名稱
*注: 筆記之用, 如有不妥, 還望指正。
Ⅳ linux中什麼是文件結構體
struct file結構體定義在include/linux/fs.h中定義。文件結構體代表一個打開的文件,系統中的每個打開的文件在內核空間都有一個關聯的 struct file。它由內核在打開文件時創建,並傳遞給在文件上進行操作的任何函數。在文件的所有實例都關閉後,內核釋放這個數據結構。在內核創建和驅動源碼中,struct file的指針通常被命名為file或filp。
Ⅵ linux 結構體命名規則
你用C些的代碼.
解決:
結構體的命名規則和 定義變數的規則一樣 , 只能有 下劃線字 字母還有數字.. 其中只能以 下弧線 和字母開頭
按書寫風格..一些特別的名字 代表某種意思..
比如:
int nA;
char cA;
那麼 就表示 nA是 代表的 什麼類型的變狼
Ⅶ Linux常見文件結構體有哪些
linux虛擬文件系統核心數主要有以下幾個數據結構: * 超級塊結構(struct super_block {...} ) 該結構保存了一個被安裝在linux系統上的文件系統的信息。對於基於磁碟的文件系統,該結構一般和保存在磁碟上的"文件系統控制塊"對應。
Ⅷ linux 全局結構體有沒有大小限制
單從兩個結構上看都沒啥問題,之所以你說的出錯是因為,客戶端 和 服務端,的結構不一致導致的。 你的數據過去,服務端可能會先把數據扔到內存中,然後直接memcpy方式賦值給結構體對象。這就會導致a 和length是反的。
Ⅸ linux 結構體為什麼不用typedef
typedef是把一個已經存在的類型,進行「重新」定義,而結構體本身是一個「未知」的數據類型,所以,不能使用typedef來定義
而對於已定義好的結構體類型,則可以用typedef來重新命名,如:
struct _st_ { int i; char s[100]; } ; //先定義一個結構體
typedef struct _st_ my_struct ; //重新定義一個新類型:my_struct ,與struct _st_是等效的
Ⅹ linux中定義的幾個網路報文的結構體
public struct MyStruct{ public int _number; public string _text; } 在C#中 建議你使用string而不是char數組存儲字元串 還有 請在每一個欄位前加入public 否則你會訪問不到,C#相比C是有訪問修飾的