我尝试用我的结构存储很多东西。变量似乎存储在"do-while"中,但是当我尝试访问在do-while之后存储的元素时,该元素就消失了。我做错了什么?
#include <stdio.h>
#include <stdlib.h>
struct Sauto {
int part;
};
int main() {
int i=0;
struct Sauto *car;
do {
car = malloc(sizeof(struct Sauto)+(sizeof(struct Sauto)*i));
struct Sauto car[i];
printf("part%i:", i);
scanf("%i", &car[i].part);
printf("part%i is %in", i, car[i].part);
i++;
} while (i<3);
printf("part 0 is %in", car[0].part);
return 0;
}
你用同名的"car"重新声明了一个变量。删除 do-while 循环中的声明。
您有两个错误:
- 在循环的每次迭代中,您分配一个长度递增的新缓冲区,并重复重新分配
car
。 - 你在循环中实例化一个数组
car
,该数组隐藏动态分配的car
,更糟糕的是,你在每次迭代时重新设置它
。
和赋值以及重新实例化都无效;在第一种情况下,您都有内存泄漏,并且在这两种情况下,仅分配当前分配或范围内数据的最后一个元素。 在重新实例化的情况下,这似乎在循环中工作,只是在每次迭代中重用相同的内存,但在循环之外,数组超出了范围,并且使用了未使用的最后一个car
分配,这永远不会让蜜蜂分配任何东西。
要解决这些问题,请执行以下操作之一:
struct Sauto* car = malloc( sizeof(struct Sauto) * NUMBER_OF_CARS );
do
{
...
i++;
} while ( i < NUMBER_OF_CARS );
或
struct Sauto car[NUMBER_OF_CARS];
do
{
...
i++;
} while ( i < NUMBER_OF_CARS );
基本上只有循环外car
的一个实例化/分配。
如果您先验地不知道将执行多少次迭代,则可以在循环中使用 realloc() 来扩展分配。 但是,这可能非常低效,因为它需要在每次迭代时重新分配和复制数据。
struct Sauto* car = NULL ;
do
{
car = realloc( car, sizeof(struct Sauto) * (i + 1) ) ;
'''
} while( !finished );