C语言数组类型赋值错误排查:编译报错‘assignment to expression with array type’
解决C语言编译错误:assignment to expression with array type
问题背景
我编写了如下C语言代码:
#include<stdio.h> #include<conio.h> typedef struct Student { char nume[20],situatie[11]; int grupa,nr_credite; } S; void fct() { int n,i,c; S st[100]; scanf("%d %d", &n, &c); for(i=0;i<n;i++) scanf("%s %d %d", &st[i].nume, &st[i].grupa, &st[i].nr_credite); for(i=0;i<n;i++) if (st[i].nr_credite>=n) st[i].situatie="Promovat"; else st[i].situatie="Nepromovat"; } int main() { fct(); return 0; }
编译时出现错误:
Error: C:\Users\Rebekah\Downloads\e\main.c|20|error: assignment to expression with array type
请问我忽略了什么?
问题分析与解决
这个错误其实是C语言里非常常见的一个坑——你试图直接给数组类型的变量赋值,而这在C语言中是不允许的。
错误根源
看代码里第20行附近的赋值逻辑:
st[i].situatie="Promovat";
这里的st[i].situatie是结构体中定义的char situatie[11]数组,在C语言中:
- 数组名本质是一个指向数组首元素的常量指针,它的值是固定的,无法被修改;
- 赋值运算符
=只能用于给单个变量赋值,不能直接覆盖整个数组的内容。
字符串常量(比如"Promovat")的类型是const char*,它指向只读内存中的字符串内容,不能直接绑定到数组变量上。
修正方案
要给数组赋值字符串,需要使用字符串拷贝函数strcpy(),具体步骤如下:
- 在代码开头引入
<string.h>头文件(strcpy()函数的声明在这里); - 把原来的直接赋值语句替换为
strcpy()调用; - 顺便修正几个小细节(比如
scanf里多余的&、可能的条件笔误):
#include<stdio.h> #include<conio.h> #include<string.h> // 新增头文件 typedef struct Student { char nume[20],situatie[11]; int grupa,nr_credite; } S; void fct() { int n,i,c; S st[100]; scanf("%d %d", &n, &c); for(i=0;i<n;i++) scanf("%s %d %d", st[i].nume, &st[i].grupa, &st[i].nr_credite); // nume是数组名,不用加& for(i=0;i<n;i++) if (st[i].nr_credite >= c) // 你输入了c参数,原来的>=n大概率是笔误,应该和c比较 strcpy(st[i].situatie, "Promovat"); else strcpy(st[i].situatie, "Nepromovat"); } int main() { fct(); return 0; }
简单来说,数组不能直接用=赋值,必须通过拷贝函数把字符串内容复制到数组的内存空间里,这是C语言数组的核心特性之一。
内容的提问来源于stack exchange,提问作者fancy b




