C常見面試問題
- “零”值比較
bool flag;
if (flag) {}
int flag;
if (0 == flag) {}
float flag;
const float EPSINON = 0.000001;
if (flag >= -EPSINON && flag <= EPSINON) {}
- sizeof 和 strlen 區別
- sizeof 是操作符,strlen 是庫函數;
- sizeof 參數可以是變量類型,也可以是變量, strlen 參數只能是以'\0'結尾的字符串;
- sizeof 在編譯時執行,strlen 是在運行時執行;
- sizeof 計算的是數據類型占用的內存大小,strlen 返回的是字符串的實際長度;
- sizeof 參數為指針時不會退化, strlen 會退化為指針。
- C malloc和C++ new的區別
- malloc和free對應,new和delete;
- malloc是庫函數,new是操作符,可以進行重載;
- malloc僅僅申請內存,new會執行對象的構造函數;
- malloc返回void*指針,new返回對象類型指針。
- volatile 作用
作為指令關鍵字,volatile確保本條指令不會被編譯器優化而省略,且要求每次從直接讀取。
一個被定義為volatile的變量說明這個變量可能被意想不到的改變,編譯器不應該隨便假設這個變量的值,使用這個變量的時候都必須重新讀區,而不是使用寄存器中的備份。
應用場景:
- 并行設備的硬件寄存器,如:狀態寄存器;
- 中斷子程序中會訪問的非自動變量;
- 多線程中共享的變量。
- 變量定義
- 一個整型數:
int a;- 一個指向整型的指針:
int *a;- 一個指向指針的指針,它的指針指向一個整型:
int **a;- 一個整型數組:
int a[10];- 一個整型指針數組:
int *a[10];- 一個指向整型數組的指針:
int (*a) [10];- 一個指向函數的指針,該函數有一個整型參數并返回整型數:
int (*a) (int);- 一個指針數組,該數組的指針指向一個函數,該函數有一個整型參數并返回一個整型數:
int (*a[10]) (int);
- 引用和指針的區別
- 指針是一個實體,引用是別名;
- 引用使用時不需要解引用,指針需要(*);
- 引用在定義的時候進行初始化一次,之后不可改變,指針可以改變指向;
- 引用沒有const,指針有const,const指針不可改變;
- 引用不能為空,指針可以;
- sizeof返回引用指向的變量大小,sizeof指針得到的是指針本身的大小;
- 指針自增操作改變指向的位置,引用自增是對指向的變量自增。
- static用法
- static 定義局部變量,變量存放在靜態數據區,在編譯時分配內存空間,如何沒有明確初始化,默認為0,運行時該變量在函數退出后不會釋放;
- static 定義全局變量,該變量只在文件內部可見,不能被外部引用;
- static 修飾函數,該函數只在文件內部可見。
- #define和typedef
- #define宏定義是字符替換,typedef是定義一種新的類型;
- #define是在預處理的時候進行替換,編譯階段是處理宏處理后的代碼,typedef定義的新類型是編譯階段的一部分;
- 可重入函數和不可重入函數
可重入函數:可以被多個任務或者線程共享的函數。這些函數在任何時候可以被打斷,然后再次調用,而不會丟失數據。可重入函數不依賴于全局或者靜態變量,只依賴參數和局部變量,因此,它們在多任務或者多線程環境是安全的。
不可重入函數:不可以被多個任務或者線程共享的函數。這些函數可能會使用全局變量或者靜態變量,或者其他共享的資源,如文件、輸入輸出設備等。如何一個不可重入的函數被打斷,并由另外的任務或者線程再次調用,可能導致數據的混亂,產生不可預期的結果。
- 內存布局
CSDN 內存布局
浙公網安備 33010602011771號