写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);
}
这种双重判断确保了每一步都站在安全的地面上,而不是踩在虚空里。
指针操作本身不可怕,可怕的是缺少条件判断的防护。每一处解引用前多想一秒:这指针真的有效吗?该做的检查一个都不能少,这才是写出稳定代码的基本功。