在 C99 及更高版本中,您可以在结构的末尾有一个(一维)灵活数组成员(FAM):
§6.7.2.1 结构和联合说明符
¶18 作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,灵活数组成员被忽略。特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾随填充。然而,当一个.
(或->
) 运算符的左操作数是(指向)具有灵活数组成员的结构,右操作数命名该成员,它的行为就好像该成员被替换为最长的数组(具有相同的元素类型),不会使结构大于被访问的对象;数组的偏移量应保持灵活数组成员的偏移量,即使这与替换数组的偏移量不同。如果这个数组没有元素,它的行为就好像它有一个元素,但如果尝试访问该元素或生成一个越过它的指针,则行为是不确定的。
这意味着你可以写:
typedef struct image
{
int width;
int height;
struct pixel pixels[];
} image;
但是您必须自己进行 2D 到 1D 索引映射。您还必须小心如何分配结构(必要时,它将被分配,malloc()
否则数组的大小将为零)。
注意height
;的拼写修正 还要注意添加的名称typedef
(我选择image
匹配结构标签,但您可以选择您喜欢的任何其他名称)。没有名字的Atypedef
是“有效的”但没有用——你可以省略typedef
并得到相同的结果。
您可能会使用:
image *ip = malloc(sizeof(image) + width * height * sizeof(struct pixel));
if (ip != 0)
{
ip->width = width;
ip->height = height;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
ip->pixels[i*width + j] = default_pixel_value;
}
…use ip…
free(ip);
}
我不确定是否有一种将二维数组作为 FAM 的好方法。