我可以在结构体中存储泛型数组吗?



我面临一个将数组存储在结构体中的问题,这些结构体进一步写入文件。

    数组为方阵。
  1. 数组和大小n存储在一个结构体中。然后,这个结构被存储在一个文件(二进制文件)中。
  2. 这个数组的大小取决于用户在运行时的输入。
  3. 每当我将来从文件中读取结构时,我想恢复所有保存为原样的元素(我怀疑这就是为什么将数组保存为int **a不起作用)。

问题是矩阵的大小可以是可变的,并且取决于用户的选择(顺便说一下,它也存储在结构中,并进一步存储到文件中)。我承认我可以使数组的大小足够大,以容纳任何可能的大小值,但这将是对空间的浪费。此外,如果我单独编写数组的每个元素,那么单独处理每个值将是相当麻烦的。读取一个结构比单独读取多个值要好。当然,如果我这样做:

struct attribs
{
    int a[n][n], b[n][n], n;
}

则不起作用。有没有更聪明的方法来解决我的问题?目前我取a[][]和b[][]的大小分别为20X20,而期望值为4X4到9X9,并将实际值存储在n中,以便在读取结构时只读取该部分

当您将结构写入文件时(其中的长度取决于用户的偏好),您应该先写入大小,然后写入每个数组的内容。然后,要动态地重新创建矩阵,您只需要读取大小,分配适当的内存,并读取值。

如何将矩阵a与矩阵b分开取决于您,但您的示例显示它们大小相同。这表明,在您将n×n整数读入a之后,您可以开始读取b的保存值,假设您没有写入ab之间可能存在的任何可能的填充字节(分别写入size, ab,而不是一次写入整个结构以避免填充字节)。

如果您不能更改格式,并且所有值都作为一堆字节存储在一起,那么不幸的是,您必须盲目读取,存储每个值。最后一个sizeof(int)字节将是大小,同样假设没有填充字节。

如果可能的话,为自己省去很多麻烦,先写大小,然后是矩阵a,然后是矩阵b

当然,由于矩阵是动态大小的,可能您首先动态分配了一个指针数组,然后为每个指针分配了一个int型数组。在这种情况下,除非循环遍历a (a[0], a[1],…)的每个元素,否则将写入指向文件的指针,而不是它们所指向的值。

不能将变长数组作为结构类型的成员。您可以做的是使用灵活数组成员作为结构类型的最后一个成员。有关灵活数组成员特性的更多信息,请参见c99, 6.7.2.1。

在你的情况下,我认为最好的方法是在你的结构类型中使用指针成员,并通过malloc分配数组对象。

如果你使用的是GCC,你可以这样写:

int size;
scanf("%d", &size);
typedef int mat[size][size];
struct attribs {
    mat a, b;
    int n;
};
struct attribs x;//Note that you can not create large arrays on the stack
x.n = size;
//do something
//x.a[row_index][col_index]=value;

在动态内存中使用指针创建。

#include <stdio.h>
#include <stdlib.h>
struct attribs {
    void *a, *b;
    int n;
};
int main (int argc, char *argv[]) {
    int size;
    scanf("%d", &size);
    struct attribs x;
    x.n = size;
    x.a = malloc(sizeof(int[size][size]));
    x.b = malloc(sizeof(int[size][size]));
    int (*mat)[size][size] = x.a;
    (*mat)[3][3] = 15;
    printf("%dn", (*mat)[3][3]);
    free(x.a); free(x.b);
    return 0;
}

最新更新