Valgrind 错误与函数大小问题?

问题描述

晚上,我想误解了 bfs 在迷宫求解器中的工作原理。我试图找出源自我的入队函数的这个错误。我是否错误地分配了数组?

这可能是我的迷宫求解器的设计缺陷。我是否正在访问未分配的可能块?

我也发现 prev[] 有问题。我相信我需要重新设计它,因为 C90 提示我警告。

enter image description here

struct queue_t *queue_create(int size)
{
    struct queue_t *queue = malloc(sizeof(struct queue_t));
    queue->array = malloc(sizeof(struct coordinate_t) * size + 1);
    queue->capacity = size;
    queue->size = size;
    queue->array[0].coord_row = 0;
    queue->array[0].coord_col = 0;
    queue->array[queue->capacity].coord_row = 1;
    queue->array[queue->capacity].coord_col = 1;
    return queue;
}

void enqueue(struct queue_t *queue,struct coordinate_t coordinate)
{
    if (!queue_full(queue)) {
        queue->array[queue->array[queue->capacity].coord_row] = coordinate;
        queue->array[queue->capacity].coord_row = (queue->array[queue->capacity].coord_row + 1) % queue->capacity;

        if (queue_empty(queue)) {
            queue->array[0].coord_row = 1;
        }


    } else {
        printf("\nQueue is full");
    }
}

int main(int argc,char *argv[])
{
    if (argc == 2) {
        int row_map_size;
        int col_map_size;

        int start_row;
        int start_col;
        int goal_row;
        int goal_col;

        map_input(argv,&row_map_size,&col_map_size,&start_row,&start_col,&goal_row,&goal_col);


        FILE *fp = fopen(argv[1],"r");
        rewind(fp);

        if (!fp) {
            printf("\nFILE ERROR: Unable to open %s",argv[1]);
            printf("\nExiting...");
            exit(EXIT_FAILURE);
        }

        struct graph_t *graph = graph_create(row_map_size,col_map_size);

        graph->start.coord_row = start_row;
        graph->start.coord_col = start_col;
        graph->goal.coord_row = goal_row;
        graph->goal.coord_col = goal_col;

        char buffer[MAX_BUFFER];

        for (int i = 0; i < row_map_size; ++i) {
            fgets(buffer,MAX_BUFFER,fp);
            buffer[strlen(buffer) - 1] = '\0';
            strcpy(graph->adj_nodes[i],buffer);
        }

        int size = graph->rows * graph->columns;
        struct coordinate_t prev[size];

        graph_print(graph);

        int bfs = graph_bfs_path(graph,prev);

        if (bfs != -1) {
            struct coordinate_t goal = graph->goal;
            int prev_idx = goal.coord_row * graph->columns +
                goal.coord_col;

            printf("\nprev_idx: %d",prev_idx);

            while (prev[prev_idx].coord_row !=
                graph->start.coord_row
                || prev[prev_idx].coord_col !=
                    graph->start.coord_col) {

                prev_idx = goal.coord_row * graph->columns +
                    goal.coord_col;

                goal = prev[prev_idx];

                if (graph->adj_nodes[goal.coord_row]
                [goal.coord_col] == ' ') {
                    graph->adj_nodes[goal.coord_row]
                    [goal.coord_col] = '.';
                }
            }

            graph_print(graph);

            fclose(fp);
            free_graph(graph);

        } else {
            printf("\nFILE ERROR: Can't find a path");
            graph_print(graph);
            free_graph(graph);
        }

    } else {
        printf("\nUSAGE ERROR: %s [filename].txt",argv[0]);
        printf("\nExiting...");
        exit(EXIT_FAILURE);
    }

    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)