Вызвано исключение по адресу 0x00007FF7A38C615A в 2(1).exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x0000000000000000

Программа должна добавлять еще один ряд переменная (к) к двухмерному массиву, работает через раз

введите сюда описание изображения

введите сюда описание изображения

Буду благодарен за помощь!


#include <iostream>
#include<stdlib.h>
#include<time.h>


void out1(int** arr);
void out2(int** arr);


int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    srand(time(NULL));

    int** arr, n = 4, m = 4, k;

    scanf_s("%d", &k);

    arr = (int**)malloc(m * sizeof(int));

    for (int i = 0; i != m; i++)
        arr[i] = (int*)malloc(m * sizeof(int));
    for (int i = 0; i != m; i++)

        for (int j = 0; j != n; j++)
            arr[i][j] = rand() % 10;


    out1(arr);

    int* pm = &m;

    *pm = 5;
     
    
       for (int j = 0; j != n; j++)
        {
            arr[m-1][j] = arr[k][j];
        }
    
     
       out2(arr);
}

void out1(int** arr)
{
    int m = 4; int n = 4;
    for (int i = 0; i != m; i++)
    {
        for (int j = 0; j != n; j++)
            printf("%d ", arr[i][j]);
        printf("\n");
    }
    printf("\n\n");
}

void out2(int** arr)
{
    int m = 5; int n = 4;
    for (int i = 0; i != m; i++)
    {
        for (int j = 0; j != n; j++)
            printf("%d ", arr[i][j]);
        printf("\n");
    }
    printf("\n\n");
}



Ответы (1 шт):

Автор решения: nomnoms12

Вы неправильно выделяет память. Во-первых, нужно выделять её под массив указателей на целые числа. А вы выделяете под массив целых чисел (на x64 это в 2 раза меньше памяти):

arr = (int**)malloc(m * sizeof(int));

Во-вторых, вы выделяете недостаточно. Ошибка сегментации происходит на этом участке:

int* pm = &m;
*pm = 5;

for (int j = 0; j != n; j++)
{
    arr[m-1][j] = arr[k][j];
}

На первой итерации цикла вы пытаетесь обратиться к памяти по адресу arr[m-1], то есть к arr[4]. Нумерация в массивах начинается с нуля, и это пятый элемент. Но вы пытались выделить только под 4:

int** arr, n = 4, m = 4, k;
arr = (int**)malloc(m * sizeof(int));

for (int i = 0; i != m; i++)
    arr[i] = (int*)malloc(m * sizeof(int));

Выделяйте память правильно и в достаточном количестве:

arr = (int**)malloc((m+1) * sizeof(int*));

for (int i = 0; i != m+1; i++)
    arr[i] = (int*)malloc(m * sizeof(int));
→ Ссылка