使用malloc为结构体指针数组分配内存报可修改左值错误如何解决
错误原因
你结构体中定义的char *entity[]属于C语言的柔性数组成员,触发报错的核心原因有两个:
- 柔性数组成员本身是不可被赋值的左值,直接执行
s.entity = malloc(...)操作不符合语法要求,才会弹出expression must be a modifiable lvalue错误 - 直接在栈上声明
entity s;时,编译器不会为柔性数组成员预留内存空间,这种声明方式本身就不符合柔性数组的使用规范
修复方案
你可以根据自己的使用场景二选一:
方案1:按柔性数组的规范分配内存
柔性数组需要和结构体本身一起分配内存,不需要单独给数组成员赋值,代码示例如下:
typedef struct { int id; char *entity[]; }entity; // 分配内存:结构体本身大小 + 30个char*指针的占用空间 entity *s = malloc(sizeof(entity) + 30 * sizeof(char *)); if (s == NULL) { // 内存分配失败的处理逻辑 } // 使用示例 s->id = 1001; s->entity[0] = malloc(16); strcpy(s->entity[0], "test string"); // 释放内存:先释放每个字符串元素的空间,再释放结构体本身 free(s->entity[0]); free(s);
方案2:修改结构体成员为二级指针单独分配
如果不需要用柔性数组,可以把结构体中的数组成员改为二级指针,即可支持单独分配内存:
// 修改后的结构体定义 typedef struct { int id; char **entity; }entity;
之后就可以用你原来的逻辑分配内存了:
entity s; s.entity = malloc(30 * sizeof(char *)); if (s.entity == NULL) { // 内存分配失败的处理逻辑 } // 使用和释放:用完先逐个释放s.entity[i],再释放s.entity即可
内容的提问来源于stack exchange,提问作者MichaelLearner
相关产品推荐
相关产品推荐

