You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:05:27