Intereting Posts
В pthread_mutex_lock содержится инструкция по управлению памятью? несовместимые типы при назначении типа ‘char ‘ из типа ‘char *’ о выражении «& anArray» в c Есть ли минимальный размер кучи Как я могу связать свой код C с библиотекой PCRE? (Ошибки компоновщика в настоящее время бросаются.) OS X: Генерировать дамп ядра без снижения процесса? Как получить данные из WMI с помощью приложения C? Преобразование строки в строку кода в C Использование указателей для эмуляции Pass-by-Reference в функции Pass-by-Value (C и C ++) Соглашение об именах в Objective C / C начинается с «_»? Как удалить предупреждение в gcc 4.6: отсутствует инициализатор ? ошибка компиляции: запрос для члена в чем-то не структуре или объединении Почему не используется wchar_t в коде для Linux / связанных платформ? Обнаружение небольших кругов с помощью OpenCV (плохое качество изображения) Возвращаемое значение fscanf

Динамическое распределение (malloc) непрерывного блока памяти

Для назначения я должен выделить непрерывный блок памяти для структуры, но сначала я попытаюсь сделать это с помощью 2D-массива int и посмотрю, правильно ли я его понимаю. У нас был пример в книге, который создает блок памяти для массива указателей (строк), а затем инициализирует столбцы и указывает на них указатель. Этот пример:

int **CreateInt2D(size_t rows, size_t cols) { int **p, **p1, **end; p = (int **)SafeMalloc(rows * sizeof(int *)); cols *= sizeof(int); for (end = p + rows, p1 = p; p1 < end; ++p1) *p1 = (int *)SafeMalloc(cols); return(p); } void *SafeMalloc(size_t size) { void *vp; if ((vp = malloc(size)) == NULL) { fputs("Out of mem", stderr); exit(EXIT_FAILURE); } return(vp); } 

Я в основном должен делать то, что делает вышеприведенный код, за исключением того, что он является одним непрерывным блоком памяти. Ограничение: мне разрешено только один раз вызвать malloc, а затем я должен использовать указатель math, чтобы узнать, для чего инициализировать указатели. Поэтому я думал, что я бы инициализировал достаточно памяти с чем-то вроде:

 int *createInt2D(size_t rows, size_t cols) { malloc(rows * sizeof(int *) + (row + cols) * sizeof(int)); } 

Но это не кажется совершенно правильным, так как я бы подумал, что мне нужно будет вывести void *, возвращаемый из malloc, но это комбинация int и int *. Поэтому я не совсем уверен, что я на правильном пути. Мысли?

Если вам нужен непрерывный массив, вы должны malloc(rows * cols * sizeof(int)) .

Затем вы получите доступ к arr[x, y] :

 arr[x * cols + y] 

Ты на правильном пути. Блок, возвращаемый malloc, гарантированно будет правильно выровнен для int * или int; вы можете использовать его для. Типизация – это не одноразовая операция.

Если вы собираетесь использовать исключительно адрес array[row, col] , вы можете обойтись без выделения дополнительного пространства для указателей строк. Если вы хотите использовать array[row] для получения списка столбцов int * , вам нужно будет указать пространство для указателей столбцов в вашем распределении.

Надеюсь, этого достаточно, чтобы помочь с вашим упражнением.

 malloc((row * cols) * sizeof(int)); 

Это строка * cols, которая представляет собой количество элементов в 2D-массиве, а не row + cols.

Нет необходимости умножать на размер int * . Это используется только для выделения указателей для строк. То же самое и с суммой строк и столбцов. Достаточно выделить (rows * cols) * sizeof любой структуры.