【发布时间】:2017-09-28 22:39:26
【问题描述】:
我正在编写以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "planes.h"
int main(void)
{
plane* planes=NULL;
int size=0;
readPlanes(&planes, &size);
free(planes);
planes=NULL;
return EXIT_SUCCESS;
}
void readPlanes(plane** planes, int* size)
{
char buffer[100]={'\0'};
int airplaneID, modeli;
float fuel;
char modelc;
int invent=0;
int rettest=0;
do{
printf("Enter the number of planes:\n");
fgets(buffer, 100, stdin);
rettest=sscanf(buffer, "%d", size);
if((*size)<=0)
{
printf("Invalid number of planes: enter a non negative number\n");
rettest=0;
}
}while(rettest!=1);
*planes=(plane*)calloc((*size), sizeof(plane*));
for(invent=0; invent<(*size); invent++)
{
planes[invent]=calloc(1, sizeof(plane));
do{
rettest=0;
printf("Enter the airplaneID:\n");
fgets(buffer, 100, stdin);
rettest=sscanf(buffer, "%d", &airplaneID);
if(airplaneID<0)
{
printf("Invalid airplaneID: enter a positive number\n");
rettest=0;
}
}while(rettest!=1);
planes[invent]->airplaneID=airplaneID;
do{
rettest=0;
printf("Enter the model:\n");
fgets(buffer, 100, stdin);
rettest=sscanf(buffer, "%c %d", &modelc, &modeli);
if(modeli<0 || modelc<'A' || modelc>'Z')
{
printf("Invalid model: enter an uppercase letter followed by a non negative number\n");
rettest=0;
}
}while(rettest!=2);
planes[invent]->planemodel.letter=modelc;
planes[invent]->planemodel.number=modeli;
do{
rettest=0;
printf("Enter the fuel:\n");
fgets(buffer, 100, stdin);
rettest=sscanf(buffer, "%f", &fuel);
if(fuel<0.0f)
{
printf("Invalid fuel: enter a non negative number\n");
rettest=0;
}
}while(rettest!=1);
planes[invent]->fuel=fuel;
}
}
头文件为:
#ifndef PLANES_H_INCLUDED
#define PLANES_H_INCLUDED
typedef struct
{
char letter;
int number;
}model;
typedef struct
{
int airplaneID;
model planemodel;
float fuel;
}plane;
void readPlanes(plane**, int*);
int lowestFuel(plane*, int);
void printID(plane*, int, char*);
#endif // PLANES_H_INCLUDED
无论如何,当我使用 planes=1 运行程序时,程序运行没有问题。但是,如果我尝试使用 2 架或更多架飞机运行它,则会出现以下错误(在程序结束时,用户输入所有飞机的所有参数后):
检测到堆栈破坏:/home/user/Documents/program/bin/Debug/program 已终止 中止(核心转储)
我不知道为什么会发生这种情况以及我的问题在哪里。有人能帮我吗?
【问题讨论】:
-
标准 C 没有 C++ STL 意义上的“向量”。看起来您想要的术语可能是“数组”。
-
好吧,
free(planes)不会释放你分配的所有东西,所以理论上你这里有内存泄漏。但这可能与您看到的错误无关。
标签: c memory-management struct