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

为何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:51:11