在 Linux 下,sizeof
是一個編譯時運算符,用于計算數據類型或對象所占用的內存字節數
對指針使用 sizeof
:當對指針使用 sizeof
時,通常返回指針本身(而非指向的數據類型)所占用的大小。這可能導致錯誤的結果,因為指針大小與其指向的數據類型大小不同。例如,在 64 位系統上,所有類型的指針大小都是 8 字節。
int arr[] = {1, 2, 3};
int *ptr = arr;
sizeof(ptr); // 返回指針大小,而非整個數組大小
對動態分配的內存使用 sizeof
:sizeof
只能測量靜態分配的內存大小。對于動態分配的內存(如使用 malloc
或 calloc
分配的內存),sizeof
無法返回實際分配的內存大小。
int *arr = (int *) malloc(10 * sizeof(int));
sizeof(arr); // 返回指針大小,而非實際分配的內存大小
對空指針使用 sizeof
:對空指針使用 sizeof
不會引發錯誤,但可能導致意外的結果。空指針本身具有特定的大小,通常與其基礎類型相同。
int *ptr = NULL;
sizeof(ptr); // 返回指針大小,而非 0 或錯誤
對函數使用 sizeof
:在 C 語言中,sizeof
不能直接應用于函數。嘗試這樣做將導致編譯錯誤。
int func(int x) {
return x * 2;
}
sizeof(func); // 編譯錯誤
對字符串字面量使用 sizeof
:對字符串字面量使用 sizeof
時,它將包括字符串的結尾空字符(\0
)。
sizeof("hello"); // 返回 6,因為包括結尾空字符
要避免這些誤區,請確保在使用 sizeof
時了解其行為和限制。在處理指針和動態分配的內存時,請使用顯式的大小變量或其他方法來跟蹤內存大小。