Отладка проблемы неясного указателя C, создание массива динамического c в местоположении аргумента - PullRequest
0 голосов
/ 18 марта 2020

У меня странная проблема с указателем, которую я никак не могу понять. В одной функции (в данном случае main) я хочу объявить указатель **arr, который в конечном итоге должен стать 2D-массивом. Затем я хочу передать этот указатель в функцию (fillArray), где я хочу сгенерировать двумерный массив с dyn2Darray, а затем заполнить этот массив некоторыми данными. Затем обратно в main Я хочу что-то сделать с данными. К сожалению, это приводит к дампу ядра. Может быть, какой-нибудь мудрый C -Мастер скажет мне, что я делаю не так с моими указателями. Кроме того, размеры массива (r и c) определены в fillArray в реальной задаче, поэтому смещение определений не поможет мне. Я почти уверен, что должен быть способ сделать это, поскольку все возможно с C.

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

int **dyn2Darray(int I, int J)
{
    int **arr = malloc(sizeof(int *) * I + sizeof(int) * I * J);
    int *ptr = (int *)(arr + I);
    for (int i = 0; i < I; ++i) {
        arr[i] = (ptr + J * i);
    }
    return arr;
}

void fillArray(int ***arr, int r, int c)
{
    int count = 0,i,j;
    *arr = dyn2Darray(r, c);
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            *arr[i][j] = ++count;
}

int main()
{
    int r=3, c=4;
    int **arr = NULL;
    int i,j;

    fillArray(&arr, r, c);

    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            printf("%d ", arr[i][j]);

    return 0;
}

РЕДАКТИРОВАТЬ: Решение было найдено путем отладки с Visual Studio. Мой вопрос теперь изменился: как я могу отладить это с gdb?

1 Ответ

2 голосов
/ 18 марта 2020

Отладка вашего кода в Visual Studio показывает, что функция 'for' l oop в fillArray () фактически присваивала значения указателям строк в массиве 2d, поэтому программа вылетала после 3 итерации (так как количество строк было 3). Конечно, решение было простым: -

void fillArray(int ***arr, int r, int c)
{
    int count = 0,i,j;
    *arr = dyn2Darray(r, c);
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            (*arr)[i][j] = ++count;    //<------------CHANGE HERE
}

C иногда может раздражать, особенно из-за таких приоритетных проблем.

Кроме того, не забудьте освободить выделенную память .

...