为何传递给函数的字符串可修改?数组赋值报错原因解析
问题解析:为什么函数内给数组形参赋值合法,而直接给数组赋值报错
先看你的代码和输出:
测试代码
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
相关产品推荐
相关产品推荐

