使用大括号将数据分配给数组

时间:2011-07-23 23:13:19

标签: c arrays malloc

在C语言中,为什么以下表达式失败?

map = malloc(sizeof(Map) * tiles);
map = {
    0,2,0,0,0,0,0,0,2,0,
    0,1,0,0,0,0,0,0,1,0,
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
    2,1,0,0,0,0,0,0,1,2,
    0,0,0,0,0,0,0,0,0,0
};

我只想将这种“行/列”格式的数据填充到C数组中。但是,编译器失败并带有

error: expected expression before ‘{’ token

(在map = {line)。以其他方式填充数组工作正常,我确信括号适用于初始化...在分配内存后我不能这样做?

编辑:我通过创建一个临时字符数组然后在for循环中将数据提供给malloced映射来解决它。 仍然。我想知道为什么上面的代码会泄漏内存,如下所示。我的修复(解析临时数组并用它设置地图数据)也会泄漏内存吗?

1 个答案:

答案 0 :(得分:9)

你的Map * map;是一个指针,而不是一个数组。大括号用于聚合初始化:

int x[3] = { 1, 2, 3 };

指针不是数组,您无法使用聚合初始化语法填充内存。

这是最接近的结构:

typedef struct Map_ { int a; int b; } Map; // some struct

Map m[] = { {1,2}, {3,4}, {5,6} };  /* we initialized "Map m[3]",
                                       it has automatic storage! */

请注意,brace-list的每个元素都必须自己初始化聚合的基本类型。