我有这个函数,它读取以下格式的一些字符串:

2
London Berlin 220 1.5
London Milan 280 2.5
...

同样的东西也应该被阅读...

2是在其自身之后的字符串的数目.为此,我有以下功能:

void allocate_info(FILE* fptr, info_t* cities_info, int N){
    int tmp_flights;
    int i = 0;
    while(fscanf(fptr, "%d", &tmp_flights) == 1){
        printf("%d\n", tmp_flights); // this print!!!
        char tmp_departure[LENGTH], tmp_arrival[LENGTH];
        int tmp_price;
        float tmp_duration;
        for(int i = 0; i < tmp_flights; i++){
            fscanf(fptr, "%s %s %d %f", tmp_departure, tmp_arrival, &tmp_price, &tmp_duration);
            strcpy(cities_info[i].departure, tmp_departure);
            strcpy(cities_info[i].arrival, tmp_arrival);
            cities_info[i].price = tmp_price;
            cities_info[i].duration = tmp_duration;
        }
    }
}

"这张照片!"实际上打印所有数字,但在结束时程序失败(错误1).这是我的主要职能:

int main(void) {
    FILE* fptr = fopen("D:/ap2/lab02ex01/file.txt", "r");
    int N;
    info_t* cities_info = (info_t*)malloc(sizeof(info_t) * N);
    N = read_number_of_cities(fptr); // some other function
    allocate_info(fptr, cities_info, N); // ERROR HERE?!?

    return 0;
}

我对它感到非常困惑,因为它打印的所有东西都正确,但程序由于某种原因失败了.请帮帮我.

推荐答案

在初始化之前在main函数中使用变量N就是调用undefined behaviour,因为N的值在使用它的点是不确定的.

如果编译时出现警告(-Wall -Wextra),则可能会看到类似以下内容的警告.

warning: variable 'N' is uninitialized when used here [-Wuninitialized]

如果您使用-Wall -Wextra -Werror进行编译,这将被视为编译错误,并且必须在您对程序进行run操作之前得到修复.

您还会看到有关忽略返回值fscanf的警告,并且-Werror已被迫修复该问题.

C++相关问答推荐

为什么静态说明符为内联函数生成外部定义?

C编译器是否遵循restrict的正式定义?

测量ARM MCU中断延迟的问题

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

在 struct 中强制转换空指针

为什么该函数不将参数值保存到数据 struct 中?

为什么我不能只在内存地址中添加一个int来寻址任何数组?

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

强制转换变量以在 struct 中蚕食

试图创建一个基本的Word克隆,但遇到了障碍

这段代码用于在C中以相反的顺序打印数组,但它不起作用

递归打印二维数组(C编程)

具有正确标头的C struct 定义问题

程序对大输入给出错误答案

从Raku nativecall调用时精度不同

解密Chrome加密密钥

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

cs50拼写器分配中的无限循环