Нарушение прав доступа при чтении по адресу (СИ)

Нарушение прав доступа при чтении по адресу

Ошибку ловлю, когда пытаюсь как-либо взаимодействовать с новыми элементами массива, которые должны добавляться с помощью функции add_nums

Функция add_nums принимает указатель на динамический двумерный массив чисел (pArr) и кол-во рядков в этом массиве (row_count). После она должна увеличить размер массива на один ряд и добавить три столбца со статичными значениями (1, 10, 100).

Очевидно, что ошибка в распределении памяти, но мое новичковое виденье в Си не позволяет увидеть то, что я не правильно реализовал в коде. Буду благодарен за указку на мою ошибку.

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

void add_row(int** pArr, int row_count);

int main()
{
    int** num = (int**) malloc(1 * sizeof(int*));
    num[0] = (int*) malloc(3 * sizeof(int));

    add_row(num, 2);

    printf("%d\n", num[0][0]); // тут выводит мусор (тут все правильно)
    printf("%d\n", num[1][0]); // а тут должно выводить 100, но выдает ошибку


    int index;
    for (index = 0; index < 2; index++)
    {
        free(num[index]);
    }

    free(num);

    return 0;
}

void add_row(int** pArr, int row_count)
{
    pArr = (int**) realloc(pArr, row_count * sizeof(int*));
    pArr[row_count - 1] = (int*) malloc(3 * sizeof(int));

    pArr[row_count - 1][0] = 100;
    pArr[row_count - 1][1] = 10;
    pArr[row_count - 1][2] = 1;
}

P.S. По какой-то причине подобной ошибки не выдает, если я реализовываю данный код не через функцию, а пишу все в main.


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

Автор решения: Кирилл Солотопов

Не уверен, насколько это корректно, но по крайней мере теперь работает без ошибок.

Функция add_row должна возвращать указатель:

int** add_row(int** pArr, int row_count)
{
    pArr = (int**) realloc(pArr, row_count * sizeof(int*));
    pArr[row_count - 1] = (int*) malloc(3 * sizeof(int));

    pArr[row_count - 1][0] = 100;
    pArr[row_count - 1][1] = 10;
    pArr[row_count - 1][2] = 1;

    return pArr;
}

В main же нужно num приравнять результат функции add_row, обновляя тем самым массив:

num = add_row(num, 2);
→ Ссылка