*cord = (int**)malloc(lines*sizeof(int*));
переменная cord
имеет тип int **
, поэтому выражение *cord
имеет тип int *
. Вы делаете результат от malloc
до int **
. Таким образом, вы пытаетесь присвоить значение типа int **
выражению типа int *
, что является ошибкой.Эта строка должна быть записана как
cord = malloc(lines * sizeof *cord); // note no cast, operand of sizeof
Заметка стиля - пробел - ваш друг. Используй это. Твоим глазам не будет 20 лет навсегда.
Если число столбцов известно во время компиляции (как представляется, в данном случае), вы можете сделать выделение на один шаг:
int (*cord)[2];
...
cord = malloc(lines * sizeof *cord);
if (cord)
{
for (int i = 0; i < lines; i++)
{
fscanf(f, "%d", &cord[i][0]);
fscanf(f, "%d", &cord[i][1]);
}
...
free(cord);
}
else
// handle allocation failure
Переменная cord
имеет тип «указатель на 2 -элементный массив int
", поэтому выражение *cord
имеет тип" 2-элементный массив int
". sizeof *cord
дает нам количество байтов, необходимых для каждого подмассива, поэтому lines * sizeof *cord
дает нам общее количество байтов, необходимых для всего 2D-массива.
Преимущества - одноступенчатое распределение (что означает одношаговое освобождение), и все строки в массиве смежны.
Недостатков - Может потерпеть неудачу по очень большим массивам, если память достаточно фрагментирована, требует, чтобы вы знаете, число столбцов во время компиляции, или что ваш компилятор поддерживает массивы переменной длины (которые были введены в C99 и не являются обязательными, как от C2011).
В общем, ваши malloc
заявления должны быть записаны в виде
T *ptr = malloc(N * sizeof *ptr); // calloc(N, sizeof *ptr)
или
T *ptr = NULL;
...
ptr = malloc(N * sizeof *ptr); // calloc(N, sizeof *ptr);
C не требует от вас, чтобы бросить результат malloc/calloc
. C++ требует, так как он не позволяет неявное преобразование указателей void
, но если вы пишете C++, вы должны использовать new
и delete
вместо malloc
и free
.
1. По состоянию на стандарт 1989 года, во всяком случае; до C89, malloc
и calloc
возвращено char *
вместо void *
, поэтому для составителей pre-C89 отливка была. MSVC поддерживает стандарт C89, поэтому вам не нужен литье
В C не выдавать результат 'malloc', а * всегда проверять * на отказ от' malloc'; также разрешить все предупреждения и информацию об отладке. –
Это не 2D-массив, а только эмуляция. Вы можете определить и инициализировать свой массив одним вызовом 'malloc' как' int (* cord) [2] = malloc (2 * lines * sizeof (int)); '. –