Сбои динамического выделения памяти в 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));
}