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

C语言中如何通过函数修改字符串值?为何示例代码未按预期输出?

问题解答

这段代码实际会输出HelloHey,而非你预期的两次Hello,核心原因是C语言的参数传递都是值传递,哪怕传递的是指针也不例外。

具体分析:

  • main里定义的char* s = "Hey";,s是一个指针变量,存储着字符串常量"Hey"的内存地址。
  • 调用change(s)时,函数的形参char *string会复制s里的地址值,成为一个独立的局部变量——它和s只是暂存了相同的地址,但本质是两个完全不同的变量。
  • 在change里执行string = "Hello";,只是把这个局部形参的指向改成了"Hello"的地址,完全不会影响main里的s,它依然指向原来的"Hey"。
  • 因此change里的printf输出Hello,回到main后的printf还是输出Hey,最终拼接成HelloHey。

实现修改s指向的两种方法:

方法1:传递二级指针(指针的指针)

void change(char **string){
    *string = "Hello"; // 直接修改实参指针本身的指向
    printf("%s", *string);
}

int main (void){
    char* s = "Hey";
    change(&s); // 传递s的内存地址
    printf("%s", s);
    return 0;
}

这段代码会输出HelloHello,因为我们通过二级指针直接操作了main里s的指向。

方法2:让函数返回新指针并赋值

char* change(char *string){
    string = "Hello";
    printf("%s", string);
    return string; // 返回新的字符串地址
}

int main (void){
    char* s = "Hey";
    s = change(s); // 将返回的地址重新赋值给s
    printf("%s", s);
    return 0;
}

这种方式通过函数返回新地址,在main里重新赋值给s,同样能达到修改指向的效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:40:57