C语言报错:assignment to expression with array type 问题求助
解决C语言中"assignment to expression with array type"错误
咱们来一步步拆解你遇到的问题,这个错误的核心原因是C语言里数组类型的变量不能直接用=赋值——数组名本质是指向首元素的常量指针,没法直接把另一个字符串/数组通过赋值运算符塞进去。接下来咱们逐个修正代码里的问题:
1. 修正字符串初始化的错误
你写的char a={"a"};是错误的:a被定义为单个char类型,但你用字符串字面量初始化它,会导致类型不匹配。改成下面两种合法方式之一即可:
// 方式1:定义为可修改的字符数组 char a[] = "a"; // 方式2:定义为指向字符串常量的指针(若无需修改内容可选此方式) const char *a = "a";
2. 替换数组赋值为字符串拷贝函数
既然不能直接用=给数组赋值,咱们需要用C标准库的字符串拷贝函数strcpy(追求安全性的话可以用strncpy,避免缓冲区溢出)。记得要先包含头文件#include <string.h>。
另外你代码里的(*c).titulo是在操作数组c的第一个元素,循环变量i完全没发挥作用,这是逻辑错误!应该用c[i]访问循环中的当前元素,修正后的赋值代码如下:
strcpy(c[i].titulo, a); strcpy(c[i].autor, a);
3. 修正文件打开的赋值错误
你写的f == fopen("bib.dat", "wb");用了比较运算符,不是赋值!这会导致f一直处于未初始化状态,正确写法是用赋值运算符=:
f = fopen("bib.dat", "wb");
4. 修正文件写入的逻辑
你当前循环里每次都把整个c数组写入文件,最终文件会重复存储5次完整数组的内容,这显然不是你想要的。应该每次写入当前遍历的单个元素,或者循环结束后一次性写入整个数组。比如写入单个元素的代码:
fwrite(&c[i], sizeof(livro), 1, f);
修正后的完整代码
把所有问题修复后,完整代码如下:
#include <stdio.h> #include <string.h> typedef struct objeto livro; struct objeto { char titulo[100], autor[100]; int cota; }; int main() { FILE *f; int tam=5, i=0; livro c[5]; char a[] = "a"; // 修正初始化 f = fopen("bib.dat", "wb"); // 修正赋值 if(f == NULL) { printf("erro ao abrir ficheiro"); return 1; // 出错后直接退出,避免后续非法操作 } for(i=0; i<tam; i++) { strcpy(c[i].titulo, a); // 用strcpy完成数组赋值 strcpy(c[i].autor, a); c[i].cota = i; fwrite(&c[i], sizeof(livro), 1, f); // 写入当前元素 } fclose(f); // 操作完成后务必关闭文件 return 0; }
额外提醒
- 若要更安全地避免缓冲区溢出,推荐使用
strncpy,示例:strncpy(c[i].titulo, a, sizeof(c[i].titulo)-1); c[i].titulo[sizeof(c[i].titulo)-1] = '\0'; - 文件操作完成后一定要调用
fclose(f),否则可能导致数据未完全写入磁盘。
内容的提问来源于stack exchange,提问作者Walter Palma




