2015-11-15 3 views
0

Это мое определение структурыВыделение памяти для структуры и указатель на структуру

struct node 
{ 
    int value; 
    struct node *next; 
} 

Я попытался выделяющий память с помощью этой

struct node *head1=(node *)(malloc(sizeof(struct node))); 

и это

struct node *head2=(node *)(malloc(sizeof(struct node *))); 

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

head1-> value 

и

head2->value 

они оба одинаковы.?

+0

можно назначить и получить доступ к head2-> next? – Nandu

+0

Почему вы не используете ключевое слово 'new' в C++ ?! – user1436187

ответ

1

Нет, они не то же самое.

Первый имеет достаточную память, предназначенную для размещения полной структуры, а второй - достаточно памяти для указателя. Выполняя head2->value, вы получаете доступ к нераспределенной памяти и вызывают неопределенное поведение.

Фактически вы можете «использовать» head2->value без выделения какой-либо памяти (и без присвоения значения head2). Вы не получите ошибку времени компиляции, и вы даже не заметите, что во время выполнения, но если у вас достаточно большое приложение, вы, в конце концов, увидите, что начинаются странные вещи.

1

Нет, только первый из них правильный.

Во втором случае вы выделяете меньше памяти, чем занимает ваша структура данных. Когда вы получаете доступ к value, вы совершенно в порядке, потому что value находится в начале вашего struct и находится в том, что вы выделили. Доступ с next с другой стороны будет использовать память, превышающую выделенную вами. Обманчиво, это также очень вероятно работать, из-за того, как работают распределения памяти. В большинстве случаев предоставленная вам память будет находиться где-то посередине страницы, выделенной вашему процессу, а обращения к страницам, принадлежащим вашему процессу, не приводят к сбою, поэтому, если вы попытаетесь прочитать или записать в next, , в большинстве случаев будет работать (в редких случаях, возможно, ваше размещение может оказаться в конце страницы, и в этом случае произойдет сбой в next). Однако это не будет память, выделенная для вашего объекта, и может легко быть памятью, используемой чем-то другим. Таким образом, запись в next может привести к разложению других объектов, которые вы выделили.

Подводя итог, второе распределение неверно, даже если оно работает.

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