2015-09-04 2 views
1

Я новичок в C, и это мой первый вопрос: для этой структуры:Указывает ли указатель на массив указателя на struct, если он установлен в NULL, выделяет память?

typedef struct Branch 
{ 
    Tree * thisTree; 
    struct Branch * nodes[]; 
} Branch; 

, кажется, работает нормально, если я делаю следующее:

Branch branch1; 
branch1->nodes[0] = NULL; 

даже если я не выделяет память для указателя Н.Р. 0 в массиве таким образом:

branch->node[0] = (Branch *) malloc(sizeof(Branch *)); 

если я проверить этот код:

if (branch1->nodes[0] == NULL) 
    printf("is NULL"); 

печатает на выход: есть NULL

Так что мой вопрос: уже там была выделена память для указателя?

branch1->nodes[0] 

, потому что у меня есть много структур, и если я инициализирую каждую ветвь с фиксированным числом указателей Я получаю много выделенных данные (если я проверю с функцией SizeOf). Это так: установка в NULL (выше) неправильного способа мышления?

Моя проблема заключается в том, что выделение памяти для указателя составляет 4 байта. Итак, не имея объявленного количества указателей в массиве, когда он выделяет для него память? К сожалению я пытался держать вопрос простой, но мне нужно, чтобы достичь строки через указатель структуры в соседней ветке

это означает, что структура я использую

typedef struct Branch 
{ 
    Tree * thisTree; 
    char *string; 
    struct Branch * nodes[]; 
} Branch; 

Так что, если я не

branch->node[0] = (Branch *) malloc(sizeof(Branch *)); 

и чем

branch->node[0]->String = strdup("text"); 

Ошибка ошибки компилятора.

+0

Не ввергнуть результат из 'malloc' & друзей в С. – Olaf

+0

Вы сделали. C не является Java или Python и т. Д. Указатель не является ссылкой, а является первоклассным объектом. Используйте valgrind. Простое сравнение может даже работать, если вы этого не сделали, вы не можете полагаться на _undefined behaviour_ ** not **, чтобы дать правильный результат. – Olaf

+0

Мне нравятся эти отливки. –

ответ

0

№ нулевой указатель не выделяет никакой памяти для хранения его в куче, потому что нечего выделять (отсюда и «нуль»).

В вашем массиве узлов выделяется память для хранения нулевых указателей, но столько же памяти потребуется для хранения массивов нулевых указателей целых чисел, плавающих, структурных объектов, которые вы называете.

+0

Моя проблема заключается в том, что выделение памяти для указателя составляет 4 байта. Итак, не имея объявленного количества указателей в массиве, когда он выделяет для него память? – BlindWhiteLabMouse

+0

Да, он должен выделить память для _pointer себя_. Значение массива из 10 целых чисел, 10 структур или 10 удвоений будет выделять 40 байт (4 байта * 10) или 80 байтов (8 байт * 10), работающих соответственно в 32-разрядной или 64-разрядной операционной системе. Установка этих указателей на нуль - это ** не **, чтобы не выделять ни больше, ни меньше байтов. – Mirza

+0

Это вопрос, сколько? потому что в структуре я не указывал число указателей в массиве – BlindWhiteLabMouse

0

По существу вы выделяете память указателю и размещаете там значение NULL, которое на C обычно равно 0. Но значение должно быть помещено в выделенную память, в этом случае выделенную указателю, так что да, по-прежнему выделяется память указателю, вы просто устанавливаете его значение в ноль.

Вы бы, однако, свели указатель, потеряв доступ к этой памяти, если бы вы написали branch->node = NULL;, но это не правильный путь, чтобы удалить его, как память по-прежнему выделяется, а просто недостижим, вместо этого вы должны использовать free(branch->node); чтобы не выделять память, если вы хотите это сделать.

Что касается количества выделенных позиций в памяти, которые будут определены по времени умножить sizeof() функции:

int number = 2; //assume you want two elements 
branch->node[0] = (Branch *) malloc(number*sizeof(Branch *)); 
Смежные вопросы