我可以在结构中存储通用数组吗?

时间:2014-07-22 12:36:48

标签: c algorithm struct conceptual memory-efficient

我遇到了在结构中存储数组的问题,这些问题会进一步写入文件。

  1. 数组是方形矩阵。
  2. 数组和大小n存储在结构中。然后将此结构存储在文件(二进制文件)中。
  3. 此数组的大小取决于运行时用户的输入。
  4. 每当我将来从文件中读取结构时,我想要恢复所有那些保存原样的元素(我怀疑这就是为什么将数组保存为int ** a还没有用)。
  5. 问题在于矩阵的大小可以是可变的并且取决于用户的选择(顺便说一下,它也存储在结构中并且进一步存储在文件中)。 我承认我可以将数组的大小设置得足够大以容纳任何可能的大小值,但这会浪费空间。 此外,如果我单独编写数组的每个元素,那么单独处理每个值将是一件麻烦事。读取结构比单独读取许多值更好。 当然,如果我这样做:

    struct attribs
    {
        int a[n][n], b[n][n], n;
    }
    
    然后它不起作用。我的问题有更明智的方法吗?至于目前我采取[] []和b [] []各自的大小为20X20,而期望值是4X4到9X9,并将实际值存储在n中,以便只有那个部分可以在结构时轻松读取正在阅读。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果您使用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("%d\n", (*mat)[3][3]);
    free(x.a); free(x.b);
    return 0;
}

答案 2 :(得分:0)

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

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

如果你不能改变格式,并且这些值都是作为混乱的字节存储在一起,你必须盲目地读取,存储每个值。最后sizeof(int)个字节将是大小,同样假设没有填充字节。

如果可能的话,省去很多麻烦并先写下尺码,然后是矩阵a,然后是矩阵b

当然,由于矩阵是动态调整大小的,你可能首先动态分配一个指针数组,然后为每个指针分配一个int数组。在这种情况下,除非您遍历aa[0]a[1],...)的每个元素,否则您编写了指向文件的指针而不是它们指向的值。< / p>