在C中的结构内初始化数组

时间:2010-12-08 08:36:06

标签: c struct

我正在尝试在C程序中的结构中允许可变长度数组。像这样:

struct result{
    int column;
    int row;
    const char* a[var][var];  
};

我该怎么做?

即使是以下定义也可以:

struct result{
    int column;
    int row;
    const char* a[row][column];
};

请帮忙......

4 个答案:

答案 0 :(得分:2)

C结构中不能有可变大小的数组。

你可以指向可变大小的数组(你需要分别处理空间的分配),但你要声明指针数组

如果你想要一个指针数组,试试

const char (*a)[][];

(如果希望两个维度都可变,则需要将数组作为指向数组的指针数组进行管理)

答案 1 :(得分:2)

只需使用指针即可。你必须做动态内存分配。不要忘记free()为你的数组分配的内存:)

P.S。:如果您需要一个二维数组,请使用指向指针(即为指针数组分配内存)

答案 2 :(得分:1)

使用malloc函数进行动态分配。

在您的情况下,您应该执行以下操作:

#include <stdlib.h> /* header file for the malloc function */

void allocateResult(struct result* res, int row, int column) {
    res->a = (const char*) malloc(row * column * sizeof(char));
}

请注意sizeof(char)等于1(几乎所有时间),但对于其他类型,您必须这样做。

此解决方案意味着在程序结束之前释放已分配的内存。你必须将结构中的指针传递给free:

void freeResult(struct result* res) {
   free(res->a);
}

答案 3 :(得分:1)

对于单维数组,您可以执行以下操作:

struct TEST {
    ...
    int size;
    char string[];
}

其中size字段表示字符串数组中有多少个字符。数组必须是结构的最后一个成员,并且必须动态分配结构的内存。在这种情况下,分配的大小应为sizeof(struct TEST) + size * sizeof(char)

结构中不能有多个可变大小的数组。多维可变大小的数组比较棘手。除非只有一个尺寸未知,特别是第一个尺寸,否则无法完成。

struct TEST {
    ...
    int size;
    char string[][100];
}

编辑:

正如其他海报所提到的,你可以指向一个或多个数组,代价是必须与结构分开管理它们的内存区域。

编辑2:

这至少是ISO C99标准的一部分。无耻地复制第6.7.2.1段第16分段:

  

16作为特例,最后一个元素   一个以上的结构   指定成员可能不完整   数组类型;这被称为灵活的   数组成员。有两个例外,   灵活的数组成员被忽略。   首先,结构的大小应   等于最后一个的偏移量   其他相同的元素   取代灵活的结构   数组成员的数组   未指定长度.106)......