C89标准下多次赋值后指针丢失问题求助
问题分析与解决方案
嘿,我来帮你搞定这个指针问题!你遇到的核心问题是C语言的参数传递是值传递,函数里修改的只是参数的副本,根本影响不到main里的原始变量。
咱们一步步拆解你的代码问题:
- 在
main里你声明了char *q,但没初始化,这时候它是个野指针,指向的内存是不确定的。 - 当你调用
a(p, q)时,q的值(那个随机的野指针地址)被复制给了函数a的参数q——这两个q是完全独立的变量,只是名字一样而已! - 在
a函数里你给自己的q赋值为b(p)的返回值,这个修改只在a函数内部有效,main里的q还是原来的野指针状态,所以最后printf("main(): %s\n", q)自然没法正确输出,甚至可能直接程序崩溃。
解决方法:使用二级指针传递
要让函数能修改main里的指针q,你需要传递指针的指针(也就是二级指针char **),这样函数就能通过地址找到main里的q,直接修改它的指向。
修改后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> char * b(char *p) { char *z; z = p; printf("b(): %s\n", z); return z; } // 修改参数为二级指针,接收main中q的地址 void a(char *p, char **q) { // 通过*q修改main里q的指向 *q = b(p); printf("a(): %s\n", *q); } // 标准main返回类型是int,C89也推荐这么写 int main(void) { char *p = (char *) malloc(15); char *q; strcpy(p, "This is a test"); // 传递q的地址给a函数 a(p, &q); printf("main(): %s\n", q); free(p); return 0; }
关键修改点说明
- 把
a函数的第二个参数从char *q改成char **q,这样它接收的是main中q的内存地址。 - 在
a函数里用*q = b(p),这里的*q就是对main里q的直接引用,赋值后main里的q就会指向正确的字符串地址。 - 调用
a函数时,传递&q(q的地址)而不是q本身。
另外补充个小细节:C标准里main函数的返回类型应该是int,虽然C89允许void main,但写成int main(void)并在最后return 0会更规范,避免一些潜在问题。
内容的提问来源于stack exchange,提问作者Shah Jee
相关产品推荐
相关产品推荐

