You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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(),具体步骤如下:

  1. 在代码开头引入<string.h>头文件(strcpy()函数的声明在这里);
  2. 把原来的直接赋值语句替换为strcpy()调用;
  3. 顺便修正几个小细节(比如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

火山引擎 最新活动