2015-02-26 7 views
0

. Моя проблема требует преобразования фиксированного размера массива в динамическое распределение памяти. Я пробовал всевозможные высказывания calloc, malloc и relloc, но ничего не работало. Я думаю, даже указатель данных void * был бесполезен.Динамическое распределение памяти C

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

Node *lists[100] //this does my job 
lists[listNo] = NULL; 

, если я хочу использовать таНос:

Node *lists = (Node) malloc(100*sizeof(Node)); 
lists[listNo] = NULL; // gives me error when I use malloc or calloc and the error is assigning Node from void* 
+1

Возможно, вы используете компилятор C++ для кода C? Попробуйте '#ifdef __cplusplus'' #error wrong compiler' '# endif' – pmg

+0

Я использую только компилятор C –

+0

Не могли бы вы показать код, в котором вы подали иск malloc, и вы получите сообщение об ошибке? Вы получаете ошибку компиляции или ошибку при выполнении кода? – chmike

ответ

5

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

Node **lists = malloc(100*sizeof(Node*)); 
lists[listNo] = NULL; 
+0

Спасибо тонну снова сэр. Ты жжешь! :) –

+0

@AbhishekSingh, пожалуйста, не забудьте проверить, что распределение выполнено успешно. –

+0

@chmike Хотя вышеупомянутое исправляет ошибку и работает нормально, но я не могу получить успешные результаты с проверкой распределения памяти. Я попытался предоставить Node ** lists = malloc (1 * sizeof (Node *)); Это также работает для 4 списков в качестве входных данных. Так что я немного запутался сейчас –

3

Основываясь на своем утверждении, что:

Node *lists[100] 

... делает работу, то это массив из 100 указателей (для типа Node). Обычная версия переменной длины, которая является:

Node **lists; /* points to first pointer in dynamic array */ 
int lists_size; /* you need a variable to hold the size */ 

Если массив очень большой, используйте size_t из <stdlib.h> вместо междунар, но ИНТ проще использовать с небольшими массивами и индексных переменных. Выделяют, что с:

lists_size = 100; /* replace 100 with a computed size */ 
lists = (Node**)calloc(lists_size, sizeof (Node*)); 

Использование lists_size вместо 100 в код и все остальное будет работать так же. Использование calloc() вместо malloc() очистит выделенную память до двоичных нулей, устраняя необходимость в цикле для хранения указателей NULL для каждой реальной реализации. (Технически, стандарт C не требует, чтобы NULL был равен нулю или, по крайней мере, не в последний раз, когда я смотрел, но это требует несколько мегатонов кода Unix plus Windows.)

+0

'calloc (a, b);' может решить некоторые проблемы с выравниванием 'malloc (a * b);' также нет. –

+0

@ LuisColorado Это новость для меня. Можете ли вы привести пример? Я не могу придумать тот, который не предполагает, что я угадываю 'sizeof' объекта и ошибаюсь. –

+0

Предположим, вы создали упакованную структуру и хотите создать массив этих структур. Некоторые компиляторы ** могут использовать ** элементы структуры при построении массива, а не при определении переменной только одного экземпляра этого типа. ** calloc (3) ** как системная функция, может поддерживать и добавлять правильное дополнение к размеру элемента перед распределением памяти для массива. Я не могу проиллюстрировать это сейчас на переносном пути, но я был в прошлом. –

Смежные вопросы