学 C 语言指针的时候,你是不是也遇到过这些情况?代码编译明明通过了,一运行就崩溃;或者程序没报错,但结果乱七八糟,找了半天也不知道错在哪。其实啊,新手用指针,踩的坑都差不多。今天兔子哥就把这些常见错误列出来,附上调试解决方法,新手朋友看完,能少走不少弯路,一起往下看吧!
一、指针没初始化,一用就崩溃(野指针问题)
你是不是也遇到过:定义了个指针
int *p;,然后直接用*p = 10;,结果程序一跑就崩,还没任何提示?这就是典型的 “野指针” 错误。指针定义后如果没初始化,它里面存的地址是乱的,可能指向电脑里任何一块内存。你往里面写数据,运气好可能没事,运气差就会修改系统关键内存,程序不崩才怪。
错误代码示例:
c运行
#include int main() {int *p; // 定义了指针但没初始化*p = 20; // 直接使用野指针,危险!return 0;}调试解决方法:
- 定义指针时马上初始化,要么指向一个已有的变量,比如
int a; int *p = &a;要么暂时不用就指向 NULL,int *p = NULL;。 - 编译前先检查:所有指针是不是都有明确的指向?没有就赶紧补上。
兔子哥刚开始学的时候,就因为这个错,程序崩了十几次,后来养成了 “定义指针必初始化” 的习惯,就很少再犯了。
二、把数组名当指针瞎改,结果一团糟
为啥会这样:数组名看着像指针,很多新手就以为能像指针一样随便赋值,比如
int arr[5]; arr = &arr[0];,结果编译器直接报错。其实数组名是 “常量指针”,它代表数组的首地址,但这个地址不能改。你想给数组名赋值,就像想把 “1” 改成 “2” 一样,根本行不通。
错误代码示例:
c运行
#include int main() {int arr[3] = {1,2,3};int *p;arr = p; // 试图给数组名赋值,错!return 0;}调试解决方法:
- 记住:数组名能当指针用,但不能被赋值。想操作数组,用一个新的指针指向它就行,比如
int *p = arr;。 - 报错时看看是不是有
arr = ...这样的句子,有的话赶紧删掉,换成指针变量操作。
三、函数传参时,想改值却没传指针
问题场景:写了个函数想改外面变量的值,结果传了普通变量进去,函数里改了半天,外面的值一点没变。
这是因为 C 语言函数参数是 “值传递”,传普通变量进去,函数里改的是副本,跟原来的变量没关系。想用函数改外面的变量,必须传指针。
错误代码示例:
c运行
#include void change(int x) {x = 100; // 改的是副本,没用}int main() {int a = 10;change(a); // 传的是普通变量printf("%d", a); // 还是10,没改成功return 0;}正确代码:
c运行
void change(int *x) {*x = 100; // 传指针,用*修改原值}// 调用时传地址change(&a);调试解决方法:
- 函数里改了参数,外面却没变?先看看函数参数是不是指针,调用时是不是传了地址(加了 &)。
- 用 printf 在函数里和函数外都打印变量值,看看是不是真的改了,哪里出了岔子。
四、指针类型不匹配,数据乱码
你遇见过吗:用
int *p指向float变量,结果打印出来的数根本不对,全是乱码。指针类型很重要,
int *只能指向int变量,float *只能指向float变量。类型不匹配,电脑解读内存的方式就错了,数据自然乱套。错误代码示例:
c运行
#include int main() {float f = 3.14;int *p = &f; // int指针指向float变量,类型不匹配printf("%d", *p); // 输出乱码return 0;}调试解决方法:
- 定义指针时,检查类型是不是和指向的变量一致。
- 输出乱码时,先看指针类型和变量类型对不对,这是最容易忽略的点。
五、free 后还在用指针,程序变 “神经病”
这个错很隐蔽:用
malloc申请了内存,free释放后,还接着用那个指针,结果有时候对,有时候错,程序跟 “神经病” 一样。free只是把内存还给系统,指针里的地址并没变。这时候再用这个指针,那块内存可能已经被系统分给别人了,你再读写,就会干扰别的数据。错误代码示例:
c运行
#include #include int main() {int *p = (int*)malloc(sizeof(int));*p = 10;free(p); // 释放内存printf("%d", *p); // 还在用已释放的指针,错!return 0;}调试解决方法:
free之后,马上把指针设为NULL,比如free(p); p = NULL;,这样再用的话,程序会直接崩溃,而不是瞎跑。- 养成习惯:释放内存后,立刻让指针指向 NULL,避免 “悬垂指针” 问题。
常见错误速查表
| 错误类型 | 典型表现 | 解决关键 |
|---|---|---|
| 野指针 | 程序崩溃、无提示错误 | 定义指针必初始化 |
| 数组名赋值 | 编译报错 | 用新指针指向数组,不直接改数组名 |
| 传参没传指针 | 函数改不了外部变量 | 函数参数用指针,调用时传地址 |
| 类型不匹配 | 输出乱码 | 指针类型与变量类型保持一致 |
| 释放后使用 | 结果不稳定、程序异常 | free 后立即设为 NULL |
指针这东西,说难也难,说简单也简单。关键是要搞懂 “地址” 和 “值” 的区别,多注意那些细节。兔子哥的经验是,写代码时别图快,每定义一个指针就多问自己一句:“它指向哪了?”“类型对不对?”。遇到错误别慌,用 printf 多打印几个中间值,慢慢就能找到问题。
其实啊,新手犯这些错很正常,谁不是从报错里慢慢学会的呢?怕就怕错了不改,或者不知道怎么改。今天这些错误和解决方法,你要是能记在心里,用指针的时候肯定能顺很多。加油,多练几次,指针就成你的 “好帮手” 了!
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
评论列表
剖析C语言指针错误,调试技巧助新手。