寥寥數筆,記錄我的C語言盲點筆記,只為曾經經歷過,亦有誤,可交流。
1.邏輯表達式的使用取值 = 表達式 ? 表達式1:表達式2;比如x = y > z ? y:z
2."+,-"等邏輯運算符優先級大於移位,移位大於邏輯運算
3.sizeof在編譯時由編譯器完成,對其傳入的參數不做運算處理。sizeof(i++);返回4;不會對實際的i進行操作sizeof和strlen的區別是,後者是運算時執行。返回遇到非NULL時的字符個數。sizeof處理數組名時會統計分配的內存數,如a[12] = {};則sizeof(a) = 12;如a [] = "aaa",則編譯器是分配4內存空間存放數據,sizeof(a)= 4;
4.強制類型轉換先於+,-,故指針類型變化後,自加操作會不同;
5.invalid combination of type specifiers無效的類型進行組合。引起的原因主要是頭文件多種數據類型define和typedef引起了錯誤。typedef是一個類型的重定義 不是宏的值的重定義 只能用於類型的替換,主要在編譯階段,需要帶有分號
define是宏定義,主要在預處理階段,不太適合做類型轉換,結尾分號會被帶入宏替換比如先定義#define Uint8 unsigned char typedef xdc_Uint8 Uint8;這就進行了宏替換為:typedef xdc_unsigned char Uint8;從而導致了類型結合無效的現象。故define宏是預處理的替換,而typedef是做到數據類型的真正轉換與定義。宏最好不要進行typedef的轉換!!!。數據類型在多處定義時,注意不要出現上述情況
6.printf輸出%號,需要使用printf("%%\n");來輸出
7.邏輯或與運算或要切記:
|和||,以及&和&&的使用。
8.取非!和~的運算優先級》 + -;
9 strcpy是將源地址開始到\0結束的字節數復制到目的地址。strlen統計的從源地址到遇到\0前的字節數,不算如\0
10.某一位置1 A |= (1 << 5);某一位置0 A &= ~(1 << 5);某一位取反 A ^= (1 << 5); 與1異或取反。
11. union進行賦值時需要使用a.b操作
12、0x%08x,輸出16進制數要達到8位,不然在前面補0
14.棧幀包括另一幀需要的函數參數,返回的pc地址以及當前幀的ebp.
15. 結構體對齊struct test{char x1;short x2;float x3;char x4;};由於編譯器默認情況下會對這個struct作自然邊界(有人說“自然對界”我覺得邊界更順口)對齊,結 構的第一個成員x1,其偏移地址為0,占據了第1個字節。第二個成員x2為short類型,其起始地址必須2字節對界,因此,編譯器在x2和x1之間填充 了一個空字節。結構的第三個成員x3和第四個成員x4恰好落在其自然邊界地址上,在它們前面不需要額外的填充字節。在test結構中,成員x3要求4字節 對界,是該結構所有成員中要求的最大邊界單元,因而test結構的自然對界條件為4字節,編譯器在成員x4後面填充了3個空字節。整個結構所占據空間為 12字節。
16. memset(),是將n個字節都設置為傳入的一個字節如memset(a, 0, 100);memcpy(dst, src, n);將src開始的n個字節copy到目的上去。
17.多進程引用的動態鏈接庫中的全局變量問題 由於不同進程間是獨立的,有自己的text和data,而全局位於數據段,故不會存在競爭的現象。
18.struct的一種結構體數組申明與定義的方法。static struct { char *name;
int offset; } _reg_list[] = {};
a