在 c 中使用带有许多结构的 malloc



我尝试用我的结构存储很多东西。变量似乎存储在"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 循环中的声明。

您有两个错误:

  1. 在循环的每次迭代中,您分配一个长度递增的新缓冲区,并重复重新分配car
  2. 你在循环中实例化一个数组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 );

相关内容

  • 没有找到相关文章

最新更新