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

为何传递给函数的字符串可修改?数组赋值报错原因解析

问题解析:为什么函数内给数组形参赋值合法,而直接给数组赋值报错

先看你的代码和输出:

测试代码

void test(char buf[80]){
    printf("%s\n", buf);
    buf="changed";
    printf("%s\n", buf);
}

int main(){
    char buf[80]="test";
    test(buf);
    printf("%s.\n", buf);
    return 0;
}

运行输出

test
changed
test.

核心原因拆解

  • 函数参数里的数组声明会被编译器转换为指针
    你写的void test(char buf[80]),编译器会自动把它解析成void test(char *buf)。也就是说,test函数里的buf根本不是数组,而是一个char*类型的指针变量。指针变量是可以被赋值的,所以buf="changed"本质上是把字符串常量"changed"的首地址赋值给这个指针,这完全符合C语言语法,编译器当然不会报错。

    而且这个修改只限于test函数的作用域内——你改的是指针本身,不是指针指向的内存内容。main函数里传递给test的是数组buf的首地址,test里修改指针变量buf的指向,不会影响main里的数组,所以main最后输出还是test.。

  • main里的buf是真正的数组类型
    在main函数中,char buf[80]="test";定义的是一个长度为80的字符数组。C语言里数组名是一个不可修改的左值(可以理解成数组名是数组首地址的常量),你不能直接给数组名赋值,比如buf="changed"这种写法违反了数组的特性,所以编译器会报错:assignment to expression with array type。

    如果要修改数组的内容,确实需要用strcpy、memcpy或者手动逐个字符赋值,这些操作是修改数组所在内存的内容,而不是给数组名赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:17:09