You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修改点说明

  1. 把a函数的第二个参数从char *q改成char **q,这样它接收的是main中q的内存地址。
  2. 在a函数里用*q = b(p),这里的*q就是对main里q的直接引用,赋值后main里的q就会指向正确的字符串地址。
  3. 调用a函数时,传递&q(q的地址)而不是q本身。

另外补充个小细节:C标准里main函数的返回类型应该是int,虽然C89允许void main,但写成int main(void)并在最后return 0会更规范,避免一些潜在问题。

内容的提问来源于stack exchange,提问作者Shah Jee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:33:38