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

C语言静态结构体实例中二维char数组的初始化与访问方法

你遇到的Too many initializers错误核心原因有两点:

  1. 结构体KeyValuesMap的values是char**指针类型,不能直接在初始化时展开多个字符串字面量赋值,需要先将同个key对应的多个值组装为字符串数组,再把数组首地址赋值给values
  2. 原有结构体没有存储每个key对应的值的数量,后续遍历无法判断边界,会出现内存越界问题

正确实现方案

1. 调整结构体定义

新增value_cnt成员存储当前key对应的value个数:

typedef struct key_values_map
{
  char *key;
  int value_cnt;
  char **values;
} KeyValuesMap;

2. 静态初始化静态表

方案A(C99及以上版本推荐,写法简洁)

用C99支持的复合字面量直接初始化每个key对应的values数组:

static KeyValuesMap key_values_map_table[] =
{
  {"key1", 3, (char*[]){"value1", "value2", "value3"}},
  {"key2", 3, (char*[]){"value1", "value4", "value5"}},
  {"key3", 2, (char*[]){"value2", "value4"}},
  {"key4", 1, (char*[]){"value5"}},
};

这里的(char*[])是复合字面量,会在当前作用域创建一个临时字符串数组,首地址直接赋值给values成员,符合静态初始化要求。

方案B(兼容老版本C编译器)

提前定义每个key对应的value数组,再引用到静态表中:

// 提前定义各key对应的value数组
char *key1_values[] = {"value1", "value2", "value3"};
char *key2_values[] = {"value1", "value4", "value5"};
char *key3_values[] = {"value2", "value4"};
char *key4_values[] = {"value5"};

static KeyValuesMap key_values_map_table[] =
{
  {"key1", 3, key1_values},
  {"key2", 3, key2_values},
  {"key3", 2, key3_values},
  {"key4", 1, key4_values},
};

3. 遍历内容示例

#include <stdio.h>

// 上面的结构体、静态表定义放此处

int main(void) {
    int key_total = sizeof(key_values_map_table)/sizeof(key_values_map_table[0]);
    for(int i = 0; i < key_total; ++i) {
        printf("Key=%s,对应值:", key_values_map_table[i].key);
        for(int j = 0; j < key_values_map_table[i].value_cnt; ++j) {
            printf("%s ", key_values_map_table[i].values[j]);
        }
        printf("\n");
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者user3898160

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:54:01