我正在尝试在C程序中的结构中允许可变长度数组。像这样:
struct result{
int column;
int row;
const char* a[var][var];
};
我该怎么做?
即使是以下定义也可以:
struct result{
int column;
int row;
const char* a[row][column];
};
请帮忙......
答案 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)......