C語言的注意點

2021-08-09 12:29:59 字數 991 閱讀 6915

參考:

#include

int main()a;

typedef struct bb;

printf("%d%d%.2f",sizeof(a),sizeof(b),sizeof(a)/sizeof(b));

輸出 24 16 0.00  (我的電腦是64位)

結構體:涉及記憶體對齊以提高記憶體的利用率,位段的使用。

因為32位機器的記憶體是以4位元組對齊的  所以第乙個就是4 8 8 4

第二個就是兩個char4個位元組 4 4  4 4  

約定為32位系統,即char 1位元組、short 2位元組、int 4位元組

該問題總結為兩條規律:

1,每個結構體成員的起始位址為該成員大小的整數倍,即int型成員的其實位址只能為0、4、8等

2,結構體的大小為其中最大成員大小的整數倍

struct

a;  輸出12

struct

b;  輸出8

上面是問題的簡化版,其實還有另外兩條規則,下面嚴格按照定義補充完整:

1,資料型別自身對齊

資料型別的起始位址為其大小的整數倍

2,結構體的自身對齊

結構體的自身對齊值為其中最大的成員大小

3,指定對齊

4,有效對齊值

有效對齊值為自身對齊值與指定對齊值中較小的乙個。(即指定對齊值超過自身對齊值無意義)

#pragma pack(1)

struct

a;  輸出7

#pragma pack(1)

struct

b;  輸出7

這個結果比較容易理解,struct成為了緊密型排列,之間沒有空隙了。

#pragma pack(8)

struct

a;  輸出12

#pragma pack(8)

struct

b;  輸出8

與第一次結果相同,說明#pragma pack(8) 沒有起到任何作用。

C語言程式設計注意點

1 scanf d input scanf要用位址符 字串除外 scanf s input 因為字串名字即為字串首位址 scanf s input 遇到空格即結束,gets input 遇到空格不結束,遇到回車結束 scanf s input 如果input是char 一定要先用malloc開闢空間...

C語言指標使用的注意點

第一題 main 執行結果是什麼?第二題 void fun char str1,char str2 main 程式執行結果是 第三題 main short par ar 1 inti for i 0 i 10 i 程式執行結果是 第四題 main p q ar p printf 5d p q pri...

C語言程式設計注意點3

1 將複雜問題分解為簡單問題的程式設計方法稱為結構化程式設計,其特點為自頂向下 逐步細化 模組化 2 定義常量的方法 define 和const define pi 3.1415926 無分號,無常量型別 const float pi 3.14159 3 函式定義 原型 在ansi c標準中,所有函...