結構體內部偏移的妙用
華清遠見嵌入式學院講師。
c語言中對結構體的處理是嚴格的按照定義順序來進行記憶體分布,所以我們可以利用這一點來十分方便地通過結構體內部的位址偏移來遍歷或賦值每乙個成員。
下面用乙個程式的片段來說明這個問題:
1.需求
程式的任務是從檔案中按照固定格式讀取學生的基本成績資訊並完成排序。
檔案中儲存的格式如下:
james:20121210:90:89:80
自左至右分別為:姓名:學號:語文成績:數學成績:英語成績
2.資料定義
根據需求定義如下結構單元存放資料:
typedef struct _student_ stu;
3.**
從中可以看到我們定義的結構體中沒有記憶體空洞(由不對齊的資料寬度導致),並且各資料按照自上至下,記憶體中自低到高排列儲存。
以下是讀取函式的實現:
int get_student_info(stu *stu, int n_stus)
stu->total = sum;
stu ++;
}free(buf);
return 0;
}
結構體內位元組對齊偏移量
struct a int a char b int c 結構體a的大小為sizeof a 4 1 4 3 12 struct b char a int b char c 結構體b的大小為sizeof b 1 4 3 1 3 12 比如 a對齊數是1,然後b是4,b對齊後偏移量是5,不是4的整數倍,則...
結構體內存對齊,計算偏移量offsetof和位段
結構體內存對齊是一種以空間換時間的做法,計算機可以更快的取到記憶體中某個位置的資料,防止了某些資料的二次訪問。我們先說下結構體對齊規則 1 成員變數要對齊到 對齊數 的整數倍上。所謂對齊數就是指編輯器預設的對齊數和該成員的大小的較小值 比如 int a 對齊數為4。2 結構體總體大小是該結構體所有對...
結構體內部儲存中的對齊問題
我們考慮如下的這個結構體 struct align 如果某個機器的整型值長度為4個位元組,並且它的起始儲存位置必須能夠被4整除,那麼這個結構體在記憶體中的儲存將如下圖所示 說明 系統禁止編譯器在乙個結構體的起始位置跳過幾個位元組來滿足邊界的對齊要求,因此所有結構體的起始儲存位置必須是結構體中邊界要求...