C 存储的数据与我在文件读取循环中可以访问的数据不同

C 存储的数据与我在文件读取循环中可以访问的数据不同,c,C,我必须读取包含数据的txt文件。我可以读取和存储数据,但我不知道为什么,一些存储的数据在读取方法后不好。 以下是我的输出: 我用完全相同的代码写出这些数据,除了第一个在循环内,第二个在循环外。 我将这些数据存储在它们自己的结构数组中。正如你所看到的,我的问题是我不能访问循环之外的数据。有什么不对劲吗 以下是完整的代码: 以及测试数据: 这在文件读取循环中: printf("%c %i - ", sorok[i].futarkod, sorok[i].datum); for(j=0;j<so

我必须读取包含数据的txt文件。我可以读取和存储数据,但我不知道为什么,一些存储的数据在读取方法后不好。 以下是我的输出:

我用完全相同的代码写出这些数据,除了第一个在循环内,第二个在循环外。 我将这些数据存储在它们自己的结构数组中。正如你所看到的,我的问题是我不能访问循环之外的数据。有什么不对劲吗

以下是完整的代码: 以及测试数据:

这在文件读取循环中:

printf("%c %i - ", sorok[i].futarkod, sorok[i].datum);
for(j=0;j<sorok[i].rendelesCount;j++) {
    printf("%i%c", sorok[i].rendelesek[j].db, sorok[i].rendelesek[j].fajta);
}
printf("\n");
for(i=0;i<5;i++) {
    printf("%c %i - ", sorok[i].futarkod, sorok[i].datum);
    for(j=0;j<sorok[i].rendelesCount;j++) {
        printf("%i%c ", sorok[i].rendelesek[j].db, sorok[i].rendelesek[j].fajta);
    }
    printf("\n");
}
这在文件读取循环之外:

printf("%c %i - ", sorok[i].futarkod, sorok[i].datum);
for(j=0;j<sorok[i].rendelesCount;j++) {
    printf("%i%c", sorok[i].rendelesek[j].db, sorok[i].rendelesek[j].fajta);
}
printf("\n");
for(i=0;i<5;i++) {
    printf("%c %i - ", sorok[i].futarkod, sorok[i].datum);
    for(j=0;j<sorok[i].rendelesCount;j++) {
        printf("%i%c ", sorok[i].rendelesek[j].db, sorok[i].rendelesek[j].fajta);
    }
    printf("\n");
}
在输出中,前两列是良好的,只是破折号后面的文本不是

test.c:65:14: warning: 'sor' may not be used as an array element due to flexible array member
      [-Wflexible-array-extensions]
    sor sorok[32];
             ^
rendeles rendelesek[];因为它位于结构的末尾,所以从理论上讲,您可以为数组分配任意多的内存。然而,这意味着任何给定sor的大小都会有所不同

C中数组的每个元素都必须具有固定的大小,从一个元素到另一个元素只是数组内存+i*sizeofelement的开始。由于sor可以有不同的大小,因此不能将其放入阵列中

您可以使用指向sor的指针数组,也可以将sor更改为包含指向渲染**rendleSek;的指针;。或者两者兼而有之,习惯使用指针是很好的

真正的问题是sor.RendleSek从未分配。无论您选择哪一个,您仍然必须将内存分配给sor.rendelesek或您正在写入其他人内存的其他人。作为灵活的数组成员,您必须使用指针数组并分配足够的内存作为sor的一部分


将输入读入这样的静态分配结构是危险和浪费的,因为您必须分配您认为最可能的元素。分配太多或太少是很容易的。相反,它们应该根据需要动态分配,但这是另一回事。

我相信,如果在这样的结构中有一个灵活的数组,那么该结构就不能用作数组成员,因为它的大小可能因实例而异。尝试使用rendeles**rendelesek;相反,必须分配或使用固定大小的数组。test.c:65:14:警告:由于灵活数组成员[-Wflexible array extensions]sor sorok[32];,因此“sor”不能用作数组元素;。谢谢,现在开始工作了!