如何在C语言结构体中正确初始化灵活的数组型数组?
如何在C语言中存储墙壁对应的颜色值(解决柔性数组成员初始化错误)
我想要存储与墙壁对应的颜色值,尝试了如下代码:
#include <stdint.h> typedef uint8_t RGB[3]; typedef RGB ColorArray[]; typedef struct { int wall_num; ColorArray wall_colors; } Map; int main(void) { int wall_num = 3; ColorArray wall_colors = { *(RGB){ 255, 0, 0 }, *(RGB){ 0, 255, 0 }, *(RGB){ 0, 0, 255 } }; Map my_map = {wall_num, wall_colors}; // error: non-static initialization of a flexible array member return 0; }
但编译时出现错误:
error: non-static initialization of a flexible array member
我试过用指针实现,但很快发现指针指向无效地址,会出现乱码颜色值甚至段错误。
请问有没有办法实现类似写法?还是这个思路完全错误,需要重新设计?
更新 - 自答
最终我选择用malloc()实现,其他方案不符合我的需求,分享我的代码供参考:
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> typedef uint8_t RGB[3]; typedef RGB RGB_Array[]; typedef struct { int wall_num; RGB_Array wall_colors; } Map; void print_map (Map *m) { printf("wall_num: %d\n", m->wall_num); for (int i = 0; i < m->wall_num; ++i) { printf("wall_colors[%d]: (R:%d, G:%d, B:%d)\n", i, m->wall_colors[i][0], m->wall_colors[i][1], m->wall_colors[i][2]); } } int main(void) { int wall_num = 3; RGB_Array color_arr = { {255,0,0}, {0,255,0}, {0,0,255} }; Map* map = malloc(sizeof(Map) + sizeof(color_arr)); map->wall_num = wall_num; memcpy(map->wall_colors, color_arr, sizeof(color_arr)); print_map(map); free(map); // 示例中的释放操作 return 0; }
另外,jxh的方案也很实用,完全满足需求,虽然不适合我的场景,但我认可该方案。
内容的提问来源于stack exchange,提问作者Bigfoot71
相关产品推荐
相关产品推荐

