Помогите найти ошибку в программе на C

Рейтинг: -1Ответов: 1Опубликовано: 05.07.2023

Компилятор выдаёт ошибку Segmentation fault, проверил на выход за пределы, вроде нигде за пределы выделенной памяти не выхожу.

main.c:

#include "golova.h"

int main(void) {
    
    int M = 25;
    int N = 10;
    char** field = (char**)malloc(M * sizeof(char*));
    
    for (int i = 0; i < M; i++) {
        field[i] = (char*)malloc(N * sizeof(char));
    }
    
    init_field(field, M, N);
    draw_field(field, M, N);
    
    clear(field, M, N);
    return 0;
}

funcs.c

#include "golova.h"

void draw_field(char** f, int M, int N) {
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            printf("%s", f[i][j]);
        }
    }
}

void init_field(char** f, int M, int N) {
    int h_count = 0;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            if ((i == 0) || (i == M)) {
                f[i][j] = '|';
                break;
            }
            if ((j == 0) || (j == N)) {
                f[i][j] = '_';
                break;
            } else {
                f[i][j] = ' '; 
            }
        }
    }
}

void clear(char ** f, int M, int N) {
    for (int i = 0; i < M; i++){
        free(f[i]);
    }
    free(f);
    getchar();   
    getchar();
}

golova.h

#ifndef GOLOVA_H
#define GOLOVA_H

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void draw_field(char ** f, int M, int N);

void init_field(char ** f, int M, int N);

void clear(char ** f, int M, int N);

#endif /*GOLOVA_H*/

Ответы

▲ 2Принят

Самое важное - field- не единый кусок памяти, а массив указателей на строки, поэтому **(f + i * M + j) не пойдёт

Здесь размерности попутаны

сhar** field = (char**)malloc(M * sizeof(char*));

for (int i = 0; i < N; i++) {

А || i == M - никогда не сработает