gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:34:55 25 4
gpt4 key购买 nike

我必须读取其中包含数据的txt。我可以读取并存储数据,但不知道为什么,有些存储的数据在读取方法后不好。这是我的输出:

enter image description here

我用完全相同的代码写出这些数据,只是第一个数据在循环内部,第二个数据在循环外部。我将这些数据存储在它们自己的结构数组中。正如您所看到的,我的问题是我无法在该循环之外访问我的数据。可能出了什么问题?

完整代码如下:https://pastebin.com/wzEJqcZG测试数据:https://pastebin.com/L7J133mz

这是在文件读取循环内:

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[];flexible array member这意味着,因为它位于结构体的末尾,理论上您可以为数组分配尽可能多的内存。然而,这意味着任何给定的 sor 的大小都会有所不同。

C 中数组的每个元素都必须具有固定大小,从一个元素到另一个元素只需 start-of-array-memory + (i * sizeof(element))。由于 sor 可以具有不同的大小,因此无法将其放入数组中。

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

<小时/>

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

typedef struct {
char futarkod;
int datum;
int rendelesCount;
rendeles rendelesek[];
} sor;

sor *sorok[32];
for( size_t i = 0; i < 32; i++) {
sorok[i] = malloc(sizeof(sor) + (sizeof(rendeles) * 32));
}

或者您可以使用 rendelesek ** 代替并直接分配。将两者结合起来可能是最好的选择。

typedef struct {
char futarkod;
int datum;
int rendelesCount;
rendeles *rendelesek;
} sor;

sor *new_sor(const size_t num_rendeles) {
sor *new = malloc(sizeof(sor));
new->rendelesek = malloc(sizeof(rendeles) * num_rendeles);

return new;
}

int main()
{
sor *sorok[32];
for( size_t i = 0; i < 32; i++) {
sorok[i] = new_sor(32);
}
<小时/>

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

关于c - 存储的数据与我可以在文件读取循环中访问的数据不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58782831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com