常识来了
白蓝主题五 · 清爽阅读
首页  > 软件进阶

指针操作中的条件判断:别让程序“跑偏”了

写C或C++代码时,指针就像一把锋利的刀,用得好效率飞起,用不好直接“割手”。尤其是在做指针操作时加上条件判断,稍不注意就会让程序崩溃得莫名其妙。

空指针不检查,等于踩雷

最常见的问题就是忘了判断指针是不是空的。比如你写了个函数处理用户传进来的数据地址,结果对方传了个NULL进来,你二话不说就开始解引用,程序立马就崩给你看。

void print_value(int *ptr) {
    if (ptr != NULL) {
        printf("值是:%d\n", *ptr);
    } else {
        printf("指针为空,不能操作!\n");
    }
}

这个if判断看着简单,却是保命的关键。就像开门前先看眼猫眼,确认有人再开,不然谁知道外面站的是邻居还是推销员。

数组越界也是指针的坑

指针常用来遍历数组,但边界没控制好,读到不该读的地方,后果很严重。尤其是配合条件判断时,逻辑写反了,可能就从最后一个元素跳到了内存深处。

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;
int i = 0;

while (i < 5) {
    printf("%d \n", *(p + i));
    i++;
}

这里用i来控制循环次数,比直接移动指针判断更安全。如果写成p < arr + 5,虽然也对,但一旦arr长度变了而你忘了改,问题就来了。

函数返回指针更要小心

有些函数会返回指向动态分配内存的指针,调用方必须判断是否成功分配。malloc可能失败,尤其在内存紧张的设备上。

char *buffer = (char *)malloc(1024);
if (buffer == NULL) {
    fprintf(stderr, "内存分配失败\n");
    return -1;
}
// 安全使用buffer
strcpy(buffer, "Hello");

这个判断不是可有可无的装饰,而是程序健壮性的体现。就像开车系安全带,平时觉得麻烦,关键时刻能救命。

多重指针别乱解

遇到二级指针、三级指针时,条件判断要一层层来。比如处理链表的指针的指针,如果不先判断外层指针是否为空,直接*p操作,程序分分钟罢工。

void delete_node(ListNode **head) {
    if (head == NULL || *head == NULL) {
        return; // 头指针或头节点为空
    }
    ListNode *temp = *head;
    *head = (*head)->next;
    free(temp);
}

这种双重判断确保了每一步都站在安全的地面上,而不是踩在虚空里。

指针操作本身不可怕,可怕的是缺少条件判断的防护。每一处解引用前多想一秒:这指针真的有效吗?该做的检查一个都不能少,这才是写出稳定代码的基本功。