C語言常見陷阱總結


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[] ={2,8,16,24};
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] = {'a','b','c','\0','1','2'};  遇到  '\0'  字符串結束

   char a[100] = {'a','b','c','0','1','2'};   '0' 代表字符不是'\0'

     char a[100] = {'a','b','c',0,'1','2'};     '\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.棧區空間的生命周期在遇到}時截止,在}之前返回棧區申請的空間不存在,因為被回收了,字符常量區的內容只能讀不能向里面寫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM