Вызвано исключение по адресу 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));

