C語言常見陷阱總結

2022-08-11 14:51:18 字數 1589 閱讀 6192

1.  1

char array1[100

]; 2

char* array2; 二者都可以當指標用,使用時有何區別?

1中字元陣列,儲存於棧區,sizeof(array1)為100,aray1代表首元素首位址,不可以被賦值,array1[0]這樣可以被賦值,陣列大小確定,難以擴容

2中儲存於字元常量區,sizeof(array2)為4,array2可以被賦值,array2[0]不可以被賦值,空間大小可變

2. 32位中,long型和指標佔4個位元組,64位中佔8個位元組

3. strcat連續拼接字串時,每次都要找到結尾,解決方案時給結尾做標記

4. const在c語言中為唯讀變數,c++中為常量

5. 一般機器預設小端儲存,蘋果機器為大端儲存

6. char a = "hello world"; 

sizeof(a) = 12    注:sizeof時算 \0 ,strlen時不算 \0 

sizeof(*a) = 1      sizeof(&a) = 4

當字元陣列以函式引數形式存在時,sizeof為4

7. printf函式執行時,計算順序是從後向前,輸出順序是從前向後,可以將printf函式中想成傳入的引數,儲存於棧區

8.

int a =;

char* p1 =a;

char* p2 = &a[3

];p2-p1 = ?

本題中,兩個位址相減,求的是指標的偏移量,p1指向的內容是2,p2指向的內容是24,p2-p1為3個4位元組大小,為12,又因為p1和p2的基本型別為1個位元組,所以(3*4)/1=12

9. 括號表示表示式,表示式要變成int型別計算;有符號要向無符號型別轉換;小型別要向大型別轉換

10.

(a=1)?2:3

a=1,表示整個表示式的值為1,所以輸出為2

11.switch case語句中,每個case過後如若沒有遇到break,則順次向下執行

12.char a[100] = ;  遇到  '\0'  字串結束

char a[100] = ;   '0' 代表字元不是'\0'

char a[100] = ;     '\0'就是0,字串結束

13.阿克曼函式  ack(1,k) = 2+x;   ack(2,x) = 3+2*x;   ack(3,x) = 2^(x+3)-3;

14.在移位運算時,資料需要補位時,符號位是什麼就補什麼

int i = 0xf0000000;i >>=1; i=0xf8000000

15.常量數值不能進行自加自減運算

16.注意與或運算,與運算時,前面表示式為假時,與運算子後面的表示式不參與運算,輸出為假,若為真,則再計算與運算子後面的表示式

或運算時,或運算子前面的表示式為真時,不計算或運算子後面的表示式,直接輸出為1,若為假,則在計算或運算子後面的表示式

17.sizeof返回值為unsigned int,當int遇到了unsigned int 時,轉換為unsigned int進行計算

18.棧區空間的生命週期在遇到}時截止,在}之前返回棧區申請的空間不存在,因為被**了,字元常量區的內容只能讀不能向裡面寫

C 常見陷阱

注 char型別在標準中是個特別的存在,它沒有被規定為有符號或無符號。比如int指的是有符號,而char不一樣。在程式設計時最好給char寫上符號,否則同樣的表示式可能在不同的編譯器 平台會有不同的結果。請觀察乙個程式輸出 int main 輸出 fffffff1,fffffff2,f0f2 fff...

c語言語法陷阱總結

學習c語言也有一段時間了,關於語法上的錯誤,現在基本上也沒犯過,不過,我還是想小結一下。運算優先順序的問題,其實在背乘法表,的時候就已經開始接觸了。那時候我們知道在加減乘除的混合運算中,先算乘除,再算加減,如果遇到括號,先算括號裡的內容,這就是優先順序問題。那麼在 c語言中,我們也有很多運算,有運算...

C陷阱總結

printf和scanf函式的格式字串中的轉換說明個數,型別與後面的引數個數和型別是否匹配,編譯器不檢查。遞增遞減指標時,編譯器並不會檢查指標是否仍然指向陣列元素,c只會保證指向陣列所有元素的指標,以及指向陣列最後乙個元素後面的第乙個位置的指標有效。所以這些有效指標是可以解引用的,但是如果解引用陣列...