合普知识库
柔彩主题三 · 更轻盈的阅读体验

指针操作注意事项:这些坑你踩过几个?

发布时间:2025-12-16 22:46:55 阅读:245 次

别让指针把你绕晕了

写C或C++代码时,指针几乎是绕不开的坎。用得好,程序高效灵活;用得不好,轻则程序崩溃,重则内存泄漏、数据错乱。很多人刚开始接触指针时,总觉得它像魔法,指哪打哪,但其实稍不注意就会掉进陷阱。

初始化前别乱用

刚定义的指针如果不初始化,它的值是随机的,指向哪里谁也不知道。这时候去读写,程序很可能直接崩掉。就像你拿到一把钥匙,还没确认门在哪就去开门,可能踹的是邻居家。

int *p; // 野指针,危险!
*p = 10; // 危险操作,可能引发段错误

正确的做法是定义时就赋值为 NULL 或指向合法地址:

int a = 5;
int *p = &a; // 正确
// 或者
int *p = NULL; // 明确为空

别忘了检查空指针

函数传参时经常用指针,但调用方可能传个 NULL 过来。如果没做判断就直接解引用,程序分分钟报错。比如处理字符串时常见这种场景:

void print_string(char *str) {
if (str == NULL) return; // 必要的防护
printf("%s\n", str);
}

别嫌麻烦,加上这行判断能省去很多调试时间。

动态内存别忘释放

new 或 malloc 出来的内存,用完就得 free 或 delete,否则就是内存泄漏。想象一下,每次打开水龙头都不关,时间久了房间就淹了。程序也一样,长时间运行后内存被耗尽,系统变慢甚至崩溃。

int *arr = (int*)malloc(100 * sizeof(int));
if (arr != NULL) {
// 使用 arr
free(arr); // 用完记得释放
arr = NULL; // 避免悬空指针

释放后把指针置为 NULL,防止后续误操作。

别返回局部变量的地址

函数内的局部变量在函数结束时就被销毁了,这时候返回它的地址,等于给人一张已经作废的地图。

int* get_value() {
int x = 10;
return &x; // 错误!x 已经不存在了
}

外部拿到这个指针去访问,结果完全不可控。应该使用动态分配或改用引用传递。

数组越界也是指针问题

指针和数组关系密切,用指针遍历数组时很容易多走一步。比如一个长度为5的数组,下标只能到4,但一不小心写成 i <= 5,指针就越界了,可能改写其他变量的数据。

int arr[5] = {1,2,3,4,5};
int *p = arr;
for (int i = 0; i <= 5; i++) { // 错了,应该是 < 5
printf("%d ", *p);
p++;
}

这种错误编译器不一定报,但运行时出问题很难查。

小心指针运算搞错偏移

指针加减不是简单的数字加减,它会根据所指类型自动计算字节偏移。比如 int 类型占4字节,p+1 其实是地址加4,不是加1。

int arr[3] = {10, 20, 30};
int *p = arr;
printf("%d\n", *(p + 1)); // 输出 20,正确

但如果误以为 p+1 是下一个字节,就会对内存布局产生误解,尤其在处理结构体或强制类型转换时更容易出错。

多个指针指向同一块内存要格外小心

两个指针指向同一地址,一个释放了内存,另一个就成了“悬空指针”。再解引用就会出事。这种情况在多人协作或复杂逻辑中特别容易发生。

int *p1 = (int*)malloc(sizeof(int));
int *p2 = p1;
free(p1);
p1 = NULL;
// 此时 p2 仍指向已释放内存,不能再用

建议释放后所有相关指针都置 NULL,避免误用。