C语言中结构内部数组的初始化

C语言中结构内部数组的初始化,c,struct,C,Struct,我试图在C程序的结构中允许可变长度数组。大概是这样的: struct result{ int column; int row; const char* a[var][var]; }; struct TEST { ... int size; char string[]; } 我该怎么做 即使是以下定义也可以: struct result{ int column; int row; const char* a[row][

我试图在C程序的结构中允许可变长度数组。大概是这样的:

struct result{
    int column;
    int row;
    const char* a[var][var];  
};
struct TEST {
    ...
    int size;
    char string[];
}
我该怎么做

即使是以下定义也可以:

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

请务必帮助…

使用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));
}

使用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));
}

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

您可以有指向数组的指针,这些数组的大小可以是可变的(您需要单独处理空间的分配),但是您要声明的是指针数组

如果需要指针数组,请尝试

const char (*a)[][];

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

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

您可以有指向数组的指针,这些数组的大小可以是可变的(您需要单独处理空间的分配),但是您要声明的是指针数组

如果需要指针数组,请尝试

const char (*a)[][];

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

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

struct result{
    int column;
    int row;
    const char* a[var][var];  
};
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)


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

struct result{
    int column;
    int row;
    const char* a[var][var];  
};
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)


只需使用指针即可。您必须进行动态内存分配。不要忘记释放()为数组分配的内存:)


附言:如果你需要一个二维数组,请使用指向指针的指针(即为指针数组分配内存)

只需使用指针即可。您必须进行动态内存分配。不要忘记释放()为数组分配的内存:)



注:如果你需要一个二维数组,请使用指向指针的指针(即为指针数组分配内存)

你有什么问题?你有什么问题?你能给我举个例子吗。。因为我很难想象这件事。在这里,如果你需要更多的细节,请不要犹豫再次评论。sizeof(char)几乎一直等于1。并非总是如此。正如()中所说,它总是c99中的1,但使用非1的大小是一个很好的方法。你能给我一个例子吗。。因为我很难想象这件事。在这里,如果你需要更多的细节,请不要犹豫再次评论。sizeof(char)几乎一直等于1。并非始终如此。正如()中所述,c99中始终为1,但非必要地使用sizeof是一个很好的点。实际上,结构中可以有可变大小的数组,它们可能非常有用,尽管有许多限制。@thkala,这似乎是Microsoft的扩展,而不是标准的C:GCC也支持它。。。它至少是C99标准的一部分(第6.7.2.1段,第16分段)@thkala:从技术上讲,VLA和柔性阵列成员之间存在差异。如果结构中允许使用VLA,那么就没有语法方法来引用实例的类型,例如在声明中。具有灵活数组成员的结构只能通过指针使用,您必须通过
malloc
@Jens分配存储:没错,它们不是VLA,也没有那么灵活。程序员可以通过为结构过度分配空间并直接访问超过其末端的空间来完成同样的事情,尽管