Сбои динамического выделения памяти в 2D массиве

Возможный дубликат:
Как правильно настроить, получить доступ и освободить многомерный массив в C?

Я пытаюсь динамически распределять память для 2D-массива, используя calloc. Столбцы фиксируются как 2, поэтому это только строки, которые являются динамическими.

Вот что я пытался:

unsigned int **pts, rows;
int main()
{
    //some code

    pts = (unsigned int **)calloc(2*rows, sizeof (unsigned int **));
}


//The code to access the array :
for(k=1;k<=i;k++)
{
    printf("\nX%d=",k);
    scanf("%d",&pts[k][0]);
    printf("\nY%d=",k);
    scanf("%d",&pts[k][1]);
}

Но проблема в том, что при доступе к массиву программа вылетает. Я использую Eclipse с MinGW GCC.

Пожалуйста, дайте мне знать, если мне нужно разместить здесь больше данных или дать мне представление о том, как с этим справиться, так как это мой первый пост.

2 ответа

Решение

Ответ Тудора - правильное решение. Но чтобы немного лучше понять, почему ваш код неправильный....

То, что на самом деле делает ваш код, - это просто выделить массив длиной 2 * строки указателя на указатель на тип int.

То, что вы пытаетесь создать, это:

an array of int** -> int* -> int
                          -> int
                          -> int
                          -> ...more
                  -> int* -> int
                          -> int
                          -> int
                          -> ...more
                  -> int* -> int
                          -> int
                          -> int
                          -> ...more
                  -> ...more

То, что вы на самом деле создали, это:

an array of int** -> int* -> nothing (null address)
                  -> int* -> nothing...
                  -> ...more

Затем вы пытаетесь присвоить int одному из нулевых адресов, указанных одним из инициализированных нулями int* в вашем массиве int** (видите, calloc удостоверился, что все ваши int* равны нулю)

Когда вы пытаетесь выполнить

scanf("%d",&pts[k][0]);

pts[k] ссылается на (k - 1) -й элемент в вашем массиве int**, но, как показано выше, хотя ваш код действительно выделил место для этого элемента, он инициализировал его как ноль. Таким образом, это pts[k] указывает на NULL. Таким образом, scanf получил адрес на основе нулевого смещения от адреса NULL... Теперь вам должно быть ясно, что это неверно.

Вот способ сделать это:

pts = (unsigned int **)calloc(rows, sizeof (unsigned int *));
for(int i = 0; i < rows; i++) {
    pts[i] = (unsigned int *)calloc(2, sizeof (unsigned int));
}
Другие вопросы по тегам