【发布时间】:2020-07-26 23:37:34
【问题描述】:
我面临一些关于使用双指针动态数组重新分配的问题。 我想要执行的是在 type Flight 的 array 时间表中添加 2 个 type Flight* 的指针 **。
为此,我依赖于 Functions.c 文件中的函数 add_flight。
此函数向用户询问航空公司和航班号值,并将这些数据存储在新的Flight* f 中。如果时间表为 null(尚未添加航班),则它为新创建的航班分配内存,否则它重新分配时间表的大小以便添加新航班。
Main.c 文件:
int main() {
int choice = 1;
Flight** schedule = NULL;
printf("---AIRPORT MANAGER---");
schedule = add_flight(schedule);
printf("\n%s : %d\n", (*schedule)->airline, (*schedule)->flightNumber);
schedule = add_flight(schedule);
printf("\n%s : %d\n", (*schedule + 1)->airline, (*schedule)->flightNumber);
return 0;
}
Functions.c 文件:
#include "Functions.h"
void mygets(char* s, int maxLength) {
fflush(stdout);
if (fgets(s, maxLength, stdin) != NULL) {
size_t lastIndex = strlen(s) - 1;
if (s[lastIndex] == '\n')
s[lastIndex] = '\0';
}
}
void flush() {
char buffer;
while ((buffer = getchar()) != EOF && buffer != '\n');
}
Flight** add_flight(Flight** schedule) {
Flight* f;
char buffer[100];
if ((f = (Flight*)malloc(sizeof(Flight*))) == NULL) {
exit(1);
}
printf("\n\n---FLIGHT CREATION---");
printf("\nAirline: ");
mygets(buffer, sizeof(buffer));
if ((f->airline = _strdup(buffer)) == NULL) {
exit(1);
}
memset(buffer, 0, 100);
printf("\nFlight number: ");
scanf("%d", &f->flightNumber);
flush();
if (schedule == NULL) {
if ((schedule = malloc(sizeof(Flight*))) == NULL) {
exit(1);
}
*schedule = f;
}
else {
int numberFlights = ((sizeof(*schedule)) / 4) + 1;
if ((schedule = realloc(schedule, numberFlights * sizeof(Flight*))) == NULL) {
exit(1);
}
*(schedule + numberFlights -1) = f;
}
return schedule;
}
在 main.c 中第二次调用 add_flight 时出现问题
在add_flight函数中,数据确实存储在新的Flight* f中,然后考虑else语句:变量numberFlights取值为2。但是,realloc不起作用,时刻表没有放大,因此这个时刻表数组中仍然只存储了第一个航班。我不明白为什么第二个航班没有添加到时间表中。
有人能解释一下为什么这个 realloc 会失败吗? 谢谢你的帮助:)
【问题讨论】:
-
使用
malloc(sizeof(Flight*),您将保留指针大小的空间,要使用struct本身的大小,请使用malloc(sizeof(Flight))或更好:malloc(sizeof *f) -
使用
sizeof运算符无法判断动态数组中有多少航班。您必须以不同的方式跟踪航班数量,例如使用额外变量或在所有航班结束时附加一个特殊的哨兵值。 (sizeof运算符在此处在编译时进行评估,但您当然想知道在运行时有多少航班。) -
@MOehm 感谢您的回答,我添加了一个变量 numberOfFlights,每次添加航班时它都会增加。但是还是不行,第二个航班没有添加
标签: c dynamic-memory-allocation allocation dynamic-arrays realloc