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

8
在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}中) 用其他方式填充数组可以正常工作,我确定括号在初始化时也起作用...但是在分配了内存之后我就无法这样做了?

编辑: 我通过创建一个临时的char数组,然后在for循环中将数据传递给malloced map来解决了这个问题。尽管如此,我仍想知道为什么上述代码会像下面指出的那样泄漏内存。我的修复方法(解析临时数组并设置映射数据)是否也会泄漏内存?


1
不仅是错误的,你还会导致内存泄漏。 - Marlon
2
你能详细说明一下,马龙吗?只知道原因不会有帮助,除非我知道为什么... - roger_rales
1
即使您的代码无法编译,它也展示了真正的内存泄漏是如何发生的。malloc返回的地址必须被释放。由于您正在将不同的地址重新分配给map,因此您失去了malloc返回的地址,因此您无法再次释放它。 - Marlon
1个回答

13

你的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! */

需要注意的是,花括号列表中的每个元素都必须初始化聚合类型的基础类型。


1
啊,我明白了。其实很有道理。我看过一些类似的代码将地图/像素数据分配在同样的方式,所以我认为这是可能的,但是经过再次核对,我意识到你说得对。 - roger_rales
@Kerrek,你能否像这样做int x[] = {1,2,3,4,5,6},在分配值时使数组成为任意大小(省略方括号中的大小)? - trusktr
@KerrekSB 哦,太好了。如果你写 int x[]; 那么 x 只是一个指向空的 int 指针吗? - trusktr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接