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
相关产品推荐
相关产品推荐

