Задать вопрос
@pavelsklyar
Начинающий программист

Как исправить ошибку сегментирования в С?

У меня есть двумерный динамический массив, состоящий, например, из 2 строк и 3 столбцов:
1 2 3
4 5 6

Суть задачи: перевернуть наш исходный массив на 90 градусов, то есть в нашем случае сделать массив из 3 строк и 2 столбцов:
4 1
5 2
6 3

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

int main() {
    
    int N, M;
    int **array;
    int **newArray;

    printf("Введите числа N и M: ");
    scanf("%d %d", &N, &M);

    array = (int **)malloc(N * sizeof(int));
    for (int i = 0; i < N; i++) {
        array[i] = (int *)malloc(M * sizeof(int));
    }

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            printf("array[%d][%d] = ", i, j);
            scanf("%d", &array[i][j]);
        }
    }

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            printf("%d ", array[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    newArray = (int **)malloc(M * sizeof(int));
    for (int i = 0; i < M; i++) {
        newArray[i] = (int *)malloc(N * sizeof(int));
    }

    printf("%d %d \n", M, N);
    for (int i = 0; i < M; i++) {
        int n2 = N - 1;
        for (int j = 0; j < N; j++) {
            newArray[i][j] = array[n2][i];
            printf("%d ", newArray[i][j]);
            n2--;
        }
        printf("\n");
    }

}


Заполнение первого массива при указанных выше параметрах происходит без проблем, второй массив поначалу тоже спокойно заполняется, но на 3 строке нового массива вылетает segmentation fault 11. Если я забиваю в первоначальный массив 3 строки и 2 столбца, то та же ошибка вылетает после заполнения 5 из 6 ячеек.

Если я выделяю под оба массива в 2 раза больше памяти, всё работает нормально.
  • Вопрос задан
  • 214 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
@alex_fedorov
Ошибка #1

array = (int **)malloc(N * sizeof(int));
newArray = (int **)malloc(M * sizeof(int));

Здесь ты должен выделять массив указателей, а не массив intов. Т.е. должно быть
array = (int **)malloc(N * sizeof(int*));
newArray = (int **)malloc(M * sizeof(int*));

Ошибка #2
Память необходимо освобождать после использования
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы