gpt4 book ai didi

c - 读取文件时重新分配错误

转载 作者:行者123 更新时间:2023-11-30 21:22:48 25 4
gpt4 key购买 nike

我对这段代码有疑问。有时它运行得很好,但有时它会在最后一次打印之前停止并显示错误消息:“'./ga'中的错误:realloc():无效指针:0x00007f97d1304ac6”。

我要疯了,因为我没有使用 realloc()!

我怀疑文件重订部分有一些问题,因为当我将这部分添加到代码中时就会出现这个问题(之前我用其他两个数组设置数据)。

#include <limits> // std::numeric_limits<double>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <utility>
//#include <math.h>
#include <algorithm> // std::lower_bound, std::find
#include <random>
#include <cmath>
#include <cstring>
#include <iomanip> // std::setprecision
#include <vector> // std::vector

#define NUM_CITIES 14

long size_pop;
long tot_elem;


int main(int argc, char *argv[]) {

size_pop = atol(argv[1]);

std::cout << size_pop << "\n";

std::cout << "double: " << sizeof(double) << "\n";
std::cout << "float: " << sizeof(float) << "\n";
std::cout << "int: " << sizeof(int) << "\n";
std::cout << "long: " << sizeof(long) << "\n";

tot_elem = NUM_CITIES * size_pop;
std::cout << "tot_elem: " << tot_elem << "\n";

// std::cin.get() != '\n';

struct timeval start, end, setup_start, setup_end, fitness_start, fitness_end, next_gen_start, next_gen_end, sort_start, sort_end;
struct timeval fitness_total_start, fitness_total_end, probability_start, probability_end, selection_start, selection_end;
struct timeval crossover_start, crossover_end, mutation_start, mutation_end;
gettimeofday(&start, NULL);

std::vector<double> v_set;
std::vector<double> v_fit;
std::vector<double> v_sor;
std::vector<double> v_sel;
std::vector<double> v_cros;
std::vector<double> v_mut;

// coordinate delle città
// int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// int y[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// città
//city city_set[NUM_CITIES];
int city_set_x[NUM_CITIES];
int city_set_y[NUM_CITIES];
int city_set_id[NUM_CITIES];

// popolazione composta da path (possibii soluzioni al problema)
int *city_x = (int *)malloc(tot_elem * sizeof(int));
// memset(city_x, -1, tot_elem * sizeof(int));
int *city_y = (int *)malloc(tot_elem * sizeof(int));
// memset(city_y, -1, tot_elem * sizeof(int));
int *city_id = (int *)malloc(tot_elem * sizeof(int));
// memset(city_id, -1, tot_elem * sizeof(int));
fit *fitness_element = (fit *)malloc(size_pop * sizeof(fit));

// mating_pool, i migliori elementi della popolazione
int *mating_x = (int *)malloc(NUM_CITIES * SIZE_MATING * sizeof(int));
int *mating_y = (int *)malloc(NUM_CITIES * SIZE_MATING * sizeof(int));
int *mating_id = (int *)malloc(NUM_CITIES * SIZE_MATING * sizeof(int));

srand(time(NULL));

// std::cin.get() != '\n';
std::cout << "read from file\n";

// leggo le coordinate delle città
const char *filename = "/home/davide/Documenti/GA/BURMA14.txt";

char *line;
size_t n = 5;

FILE *coordFile = fopen(filename, "r");
//FILE *f = fopen("/home/davide/Documenti/GA/result.txt", "w");

int i; // indice dell'array
int x, y; // coordinate delle città

while(getline(&line, &n, coordFile) != -1 && i <= NUM_CITIES)
{
int items = sscanf(line, "%d %d %d", &i, &x, &y);
if(items != 3)
exit(EXIT_FAILURE);
--i;
//std::cout << x << "\n";
//std::cout << y << "\n";
//std::cout << i << "\n";

city_set_x[i] = x;
city_set_y[i] = y;
city_set_id[i] = i;
}
fclose(coordFile);

// std::cin.get() != '\n';


// stampa
std::cout << "[CITTA.X]\n";
for(int i = 0; i < NUM_CITIES; ++i) {

// city_set_x[i] = x[i];
// city_set[i].x = i + 1;
std::cout << city_set_x[i] << " ";
}
std::cout << "\n";

std::cout << "[CITTA.Y]\n";
for(int i = 0; i < NUM_CITIES; ++i) {

// city_set_y[i] = y[i];
// city_set[i].y = i + 1;
std::cout << city_set_y[i] << " ";
}
std::cout << "\n";

std::cout << "[CITTA.ID]\n";
for(int i = 0; i < NUM_CITIES; ++i) {

// city_set_id[i] = i;
std::cout << city_set_id[i] << " ";
}
std::cout << "\n";
}

我读到的文件是这个。

1 16 96
2 16 94
3 20 92
4 22 93
5 25 97
6 22 96
7 20 97
8 17 96
9 16 97
10 14 98
11 16 97
12 21 95
13 19 97
14 20 94

最佳答案

这段代码是错误的:

char *line;
size_t n = 5;
...
int i; // indice dell'array
...
while(getline(&line, &n, coordFile) != -1 && i <= NUM_CITIES)
{
int items = sscanf(line, "%d %d %d", &i, &x, &y);
...

line未初始化,这几乎肯定会导致报告 realloc()错误。

the getline() standard :

The application shall ensure that *lineptr is a valid argument that could be passed to the free() function. If *n is non-zero, the application shall ensure that *lineptr either points to an object of size at least *n bytes, or is a null pointer.

请注意i也没有初始化,并且直到 sscanf() 才设置它的值。 while()后立即调用循环开始。但是i用于while -loop 的条件子句,可能会导致循环控制问题。

关于c - 读取文件时重新分配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50925748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com