为何将char数组作为函数参数传递后直接赋值无法修改内容?
问题分析:为什么直接赋值
char*无效而strcpy有效? 原因拆解
- 函数参数是指针副本:当你在
main里把数组name传给changeName时,传递的是数组首元素的地址,函数内部的name是个局部指针变量——它和main里的数组名name完全是两个独立的东西。执行name = "Marcus"只是把这个局部指针的指向改成了字符串常量"Marcus"的地址,根本碰不到main里的数组内存,所以原数组内容不会有任何变化。 - 数组名是常量指针:
main里的name作为数组名,本质是指向数组首元素的常量指针,不能被重新赋值。就算你在main里直接写name = "Marcus",编译器都会报错。而函数里的name是普通指针变量,赋值操作只影响它自己,和原数组毫无关系。 strcpy是内容拷贝:strcpy(name, "String")是把字符串的每个字符逐个拷贝到name指针指向的内存空间里——也就是main里数组所在的栈内存,所以能真正修改原数组的内容。
解决办法
方法1:用字符串拷贝函数(推荐)
继续使用strcpy,或者更安全的strncpy(避免数组越界),直接修改数组内容:
#include <string.h> #include <stdio.h> void changeName(char* name) { // 使用strncpy更安全,第三个参数是目标数组的最大容量,防止溢出 strncpy(name, "Marcus", 10); // 手动添加字符串结束符,因为strncpy若源字符串长度不足,不会自动补'\0' name[9] = '\0'; } int main() { char name[10] = "Jeremy"; printf("%s\n", name); changeName(name); printf("%s\n", name); // 输出Marcus return 0; }
方法2:使用指针的指针(仅适用于指针变量,不适用于数组)
如果一定要通过修改指针指向实现,需要把函数参数改成char**,但这种方式只适用于原变量是可修改的指针,而非数组名(数组名是常量,无法被重新指向):
#include <stdio.h> void changeName(char** name) { // 修改原指针的指向 *name = "Marcus"; } int main() { // 这里用char*指针,而非数组 char* name = "Jeremy"; printf("%s\n", name); changeName(&name); printf("%s\n", name); // 输出Marcus return 0; }
注意:这种方式下,
"Marcus"是字符串常量,存放在只读内存区,后续无法修改它的内容。如果需要后续编辑字符串,还是得用数组+拷贝的方式。
内容的提问来源于stack exchange,提问作者Tan Choon Shen
相关产品推荐
相关产品推荐

