C语言 由于使用字符而导致的分段错误**

mefy6pfw  于 2022-12-26  发布在  其他
关注(0)|答案(1)|浏览(118)

我必须编写一个函数来浏览我之前存储在char **中的Map。在每个char中,我必须检查它周围的8个字符,并检查这9个字符中是否至少有2个对应于'#',因此我创建了一个struct *matrix来检查这一点。
仅允许我使用以下函数/系统调用:malloc, free, exit, (f)open, (f)close, (f)read, (f)write, getline, ioctl, usleep, sigaction, signal, stat, lstat, fstat
问题是,尽管我检查了数组是否存在,程序还是返回了一个分段错误。
以下是与矩阵结构有关的两个函数:

matrix_t *create_matrix(char **map, size_t y, size_t x)
{
    matrix_t *out = malloc(sizeof(matrix_t));
    if (!out) {
        my_perr("[ERROR] Memory's allocation failure\n");
    }
    out->nbr = 0;
    set_mat_nbr(out, map, y - 1, x);
    set_mat_nbr(out, map, y, x);
    set_mat_nbr(out, map, y + 1, x);
    return out;
}
void set_mat_nbr(matrix_t *matrix, char **map, long y, long x)
{
    if (y != 0 && map[y] != NULL && x != 0 && map[y][x - 1] == '#') {
        matrix->nbr++;
    }
    if (y != 0 && map[y] != NULL && map[y][x] == '#') {
        matrix->nbr++;
    }
    if (y != 0 && map[y] != NULL && map[y][x + 1] == '#') {
        matrix->nbr++;
    }
}

下面是调用函数(这个函数还没有完成,目前只检查顶部边界):

void check_border(char **map)
{
    size_t y = 0, x = 0;
    matrix_t *matrix = NULL;
    while (map[0][x] != '\0') {
        matrix = create_matrix(map, 0, x);
        if (matrix->nbr < 2) {
            my_perr("[ERROR] Corrupted border\n");
        }
        free(matrix);
        x++;
    }
}

根据valgrind,segfault是在set_mat_nbr()的3if()上触发的,你知道我的代码出了什么问题吗?

rdlzhqv9

rdlzhqv91#

谢谢大家,我已经纠正了这个问题,现在一切都正常了。下面是新的代码:

void set_mat_nbr(matrix_t *matrix, char **map, size_t y, size_t x)
{
    if (x == 0) {
        if (map[y][x] == '#') {
            matrix->nbr++;
        }
        if (map[y][x + 1] == '#') {
            matrix->nbr++;
        }
    } else {
        if (map[y][x - 1] == '#') {
            matrix->nbr++;
        }
        if (map[y][x] == '#') {
            matrix->nbr++;
        }
        if (map[y][x + 1] == '#') {
            matrix->nbr++;
        }
    }
}

以及:

matrix_t *create_matrix(char **map, size_t y, size_t x)
{
    matrix_t *out = malloc(sizeof(matrix_t));
    if (!out)
        my_perr("[ERROR] Memory's allocation failure\n");
    out->nbr = 0;
    if (y == 0) {
        if (!map[y + 1]) {
            set_mat_nbr(out, map, y, x);
        } else {
            set_mat_nbr(out, map, y, x);
            set_mat_nbr(out, map, y + 1, x);
        }
    } else if (!map[y + 1]) {
        set_mat_nbr(out, map, y, x);
        set_mat_nbr(out, map, y - 1, x);
    } else {
        set_mat_nbr(out, map, y - 1, x);
        set_mat_nbr(out, map, y, x);
        set_mat_nbr(out, map, y + 1, x);
    }
    return out;
}

相关问题