在一行中初始化一个struct数组? (在C中)

时间:2011-05-13 14:28:40

标签: c struct initializing

我有像这样的2d结构数组,

MapStruct myMap[50][50];

所以我们可以这样初始化,

myMap[0][0].left = 0;
myMap[0][0].up = 1;
myMap[0][0].right = 5;

我知道我也可以使用下面的例子,

MapStruct myMap[50][50] = { {0,1,5}, {2,3,7}, {9,11,8} ... };

但问题是这个50x50结构中存在明显的空白点。例如,从[30] [40]到[40] [50]可能是空的 和其他一些点在这里有空,所以使用上面的括号表示法我必须为这些空点留下空括号,如{},{},{}。

现在我的问题是有没有办法在下面初始化?

myMap[0][0] = {0, 1, 5}; // gives a syntax error

每点保存两行我对此非常满意。

Ps:我使用索引myMap [x] [y]作为字典对象的键,所以我不能在中间摆脱那些空的,因为这会改变索引。

5 个答案:

答案 0 :(得分:4)

C99允许

myMap[0][0] = (MapStruct){0, 1, 5};

如果您被限制在C90,您可以使用辅助功能。

mypMap[4][2] = makeStruct(3, 6, 9);

但请注意

MapStruct myMap[50][50];
如果没有初始化程序,函数中的

将不会使用0值初始化数组,因此您必须使用

MapStruct myMap[50][50] = {0};

并且还要注意,有人可能想知道在堆栈上分配如此大的数组是否是wize。

答案 1 :(得分:1)

如果您尝试使用:

myMap[0][0] = (MapStruct) {.left = 0, .up = 1, .right = 5};

myMap[0][0] = (MapStruct) {0, 1, 5};

答案 2 :(得分:1)

如果您正在使用C99,请查找复合文字。

答案 3 :(得分:1)

C99允许这样的初始化:

MapStruct myMap[50][50] = {
    [ 0][ 5] = { /* ... */ },
    [10][20] = { /* ... */ },
    /* ... */
};

或者,您可以按分配设置值,如下所示:

MapStruct myMap[50][50];
/* ... */
myMap[ 0][ 5] = (MapStruct){ /* ... */ };
myMap[10][20] = (MapStruct){ /* ... */ };
/* ... */

请注意,第二种方法中的语法是而不是。它是由C99引入的符号,虽然它看起来像一个强制转换,但用于编写聚合类型的文字。

答案 4 :(得分:0)

这将为您提供堆上的数据而不是堆栈,但您可以使用来自<stdlib.h>的calloc来实现您想要做的事情。 calloc将分配内存空间,并将其初始化为零。

MyStruct * myMap = calloc( 50, 50 * sizeof(MyStruct));