以下是幾個高頻易錯C語言易錯代碼案例賞析。
- 浮點數比較
float x = 0.1;
if (x == 0.1) {
// 條件滿足,執行操作
}
問題:浮點數比較不應使用相等運算符 ==,因為浮點數的精度有限,應該使用范圍或誤差判斷。
- 死鎖
pthread_mutex_t mutex1, mutex2;
pthread_mutex_init(&mutex1, NULL);
pthread_mutex_init(&mutex2, NULL);
pthread_mutex_lock(&mutex1);
pthread_mutex_lock(&mutex2);
問題:兩個線程相互等待對方釋放鎖,導致死鎖,程序無法繼續執行。
- 非法指針操作
int arr[5];
int *ptr = arr + 10;
*ptr = 5;
問題:指針 ptr 指向數組 arr 中超出范圍的位置,導致訪問無效的內存位置。
- 內存對齊問題
struct MyStruct {
char a;
int b;
};
struct MyStruct obj;
char *ptr = (char *)&obj;
int value = *(int *)(ptr + 1);
問題:結構體 MyStruct 中的成員 a 是 char 類型,大小為 1 字節,但是通過指針運算訪問成員 b,可能因為內存對齊問題導致訪問錯誤的數據。
- 多線程競態條件
int counter = 0;
void increment() {
int temp = counter;
temp++;
counter = temp;
}
問題:多個線程同時訪問和修改共享的變量 counter,導致競態條件,結果不可預測。