首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何跟踪导致分段故障的原因?

如何跟踪导致分段故障的原因?
EN

Stack Overflow用户
提问于 2018-10-12 09:40:44
回答 1查看 102关注 0票数 1
代码语言:javascript
复制
typedef struct Cell {
    float   altitude;
    int     type;
}Cell;

void MAZE(FILE *fp, Cell *Map);

int main(void) {

    FILE *fp = fopen("map.bin", "rb");
    Cell *Map;
    Map = read_file(fp);
    char choice;
    while (1) {
        system("color 0f");
        system("cls");
        puts("Main menu:");
        puts("1. Show map by type.");
        puts("2. Show map by altitude.");
        puts("3. Build route.");
        puts("4. Find suitable places for biker jumps.");
        puts("5. Quit.");
        std::cin >> choice;
        std::cin.ignore();
        switch (choice) {
        case '1': {
            display_map_by_type(fp, Map);
            continue;
        }
        case '2': {
            display_map_by_altitude(fp, Map);
            continue;
        }
        case '3': {
            MAZE(fp, Map);
            continue;
        }
        case '5': {
            puts("You've decided to quit.");
            free(Map);
            return 0;
        }
        default: {
            system("color 9f");
            puts("Invalid choice.");
            puts(Press);
            getche();
            continue;
        }
        }
        return 0;
    }
}
void MAZE(FILE *fp, Cell *Map) {
    bool (*initial_maze)[10][10] = (bool (*)[10][10])malloc(sizeof(bool[10][10]));
    if (initial_maze == NULL) {
        fprintf(stderr, NaM);
        exit(-3);
    }
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            if (Map[i * 10 + j].type == 2 || Map[i * 10 + j].type == 4) {
                *initial_maze[i][j] = false;
            }
            else {
                *initial_maze[i][j] = true;
            }
        }
    }
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            printf("[%d]", Map[i *10 + j].type);
        }
        putchar('\n');
    }
    putchar('\n');
    for (int i = 0; i < 10; i++){
        for (int j = 0; j < 10; j++) {
            printf("%3s", *initial_maze[i][j] ? "." : "[]");
        }
        putchar('\n');
    }
    getchar();
    free(initial_maze);
}

这个程序有一个加载到堆- Cell *Map中的对象数组。数组在main中是可用的,在main或任何其他函数中都是可传递的和free()的-able。然而,由于某些原因,在选择选项3时会出现分段错误。我不知道为什么会发生分段错误(包括Cell *Mapbool *initial_maze[10][10])。至少我找不到发生分段错误的任何原因,没有访问未初始化的内存,也没有多个free()-s。从技术上讲,在循环中的switch中有一个switch,但这仍然不可能,因为在那之后就有一个return语句。更重要的是,它也不总是崩溃,虽然在大多数情况下是这样的。

Visual和代码块中的调试器指向free(initial_maze);行,但是在此之前没有任何东西会使数组失效。

由于一些奇怪的原因,Visual还指向system("color 0f");行,好像它会触发异常一样。

至于某些上下文,在void MAZE(FILE *fp, Cell *Map);函数中发生了什么。它应该解决一个迷宫,但是首先它必须创建一个基于传递给它的一维对象数组的2d bool数组。

我读过文档,我熟悉使用动态内存的规则。

如果您想要输出:

代码语言:javascript
复制
[0][0][2][3][1][4][1][2][0][3]
[2][1][1][0][3][4][0][2][1][0]
[4][0][4][3][1][1][0][4][1][2]
[2][1][3][1][3][2][1][3][1][0]
[2][2][3][0][0][1][2][4][4][3]
[1][3][2][1][2][2][0][1][1][3]
[4][4][0][3][1][2][0][4][1][2]
[3][0][4][4][4][1][0][3][2][0]
[1][4][3][4][3][4][0][1][1][0]
[1][1][2][2][1][1][3][1][3][3]

  .  . []  .  . []  . []  .  .
 []  .  .  .  . []  . []  .  .
 []  . []  .  .  .  . []  . []
 []  .  .  .  . []  .  .  .  .
 [] []  .  .  .  . [] [] []  .
  .  . []  . [] []  .  .  .  .
 [] []  .  .  . []  . []  . []
  .  . [] [] []  .  .  . []  .
  . []  . []  . []  .  .  .  .
  .  . [] []  .  .  .  .  .  .

然后程序挂起一点,然后崩溃。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-12 09:48:30

免责声明:这个答案是C的,因为你把问题标记成这样。但是,您的代码实际上是C++。

这是一个简单的操作符优先级错误,*initial_maze[i][j]应该是(*initial_maze)[i][j]。由于[]具有比*更高的优先级,所以您最终引用的是数组bool[10][10]乘以i,这不是目的所在。

但是,不要这样做,而是将malloc调用更改为:

代码语言:javascript
复制
bool (*initial_maze)[10] = malloc(sizeof(bool[10][10]));

然后以initial_maze[i][j]的形式访问它。读起来容易多了。

尽管正如注释中提到的那样,最初几乎不需要动态内存。你可以做一个局部的二维数组。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52776711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档