以下是几个高频易错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,导致竞态条件,结果不可预测。