C语言静态结构体实例中二维char数组的初始化与访问方法
你遇到的Too many initializers错误核心原因有两点:
- 结构体
KeyValuesMap的values是char**指针类型,不能直接在初始化时展开多个字符串字面量赋值,需要先将同个key对应的多个值组装为字符串数组,再把数组首地址赋值给values - 原有结构体没有存储每个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
相关产品推荐
相关产品推荐

