Будет ли объявление указателя на структуру выделять память для ее членов? - PullRequest
0 голосов
/ 01 ноября 2018

проверка образа программы на турбо с ++

вывод программы

#include< stdio.h>

struct node  {
    int data;
};

int main() {

    struct node *ptr;

    ptr->data=3;
    printf("%d",ptr->data);

    return 0;
}

Выход: 3

Мой вопрос заключается в том, что, хотя я не объявил экземпляр узла структуры.

например, структура узла n;

Также я не назначил память для ptr, используя malloc, он все еще выделяет место для ptr-> data. Зачем? Не следует ли просто назначить память для адреса ptr в стеке.

И где эта память для поля данных выделена, на стеке или куче .---------

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Также я не назначил память для ptr, используя malloc, он все еще выделяет место для ptr-> data.

Ничего не выделено. Без инициализатора значение ptr равно , неопределенно , и в этом случае просто указывает , что указывает на память, в которую вы можете записать, без немедленного сбоя вашей программы. Вам удалось не перезаписать ничего «важного», но это вопрос удачи больше всего на свете.

Вы должны иметь привычку инициализировать указатели, когда вы объявляете их, либо как NULL, либо как результат оператора &, либо как результат вызова malloc / calloc / realloc ,

0 голосов
/ 02 ноября 2018

Когда вы создаете указатель struct node *ptr;, он будет помещен в ваш стек. Место, где находится эта переменная, может быть где угодно в вашем стеке.

Например, он находится по адресу 0x100.

Когда переменная помещается в это место, данные, которые там находятся, не устанавливаются в 0 Так, например, по адресу 0x100 были данные 0x200, у вас будет struct node *ptr, указывающий на адрес 0x200.

Затем в этот момент вы делаете следующее: ptr->data=3; Поскольку код считает, что на вашем адресе 0x200 находится struct node, он заполнит переменную data. Таким образом, по адресу 0x200 будет записано значение 3.

Когда вам повезет (ну, на самом деле это не совсем удача, поскольку это может вызвать много проблем в дальнейшем), запись значения 3 по адресу 0x200 не вызовет никаких проблем, потому что память по адресу 0x200 не использовалась.

Но имейте в виду, что ваш код ДУМАЕТ только о том, что struct node был размещен в этом месте, но на самом деле его нет, поэтому любая другая переменная может быть в этом месте. И когда есть другая переменная по этому адресу. когда вы записываете значение 3 по этому адресу, вы перезаписываете значение этой переменной. И это может создать очень странное поведение в вашем коде.

0 голосов
/ 01 ноября 2018

В вашем коде ptr->data=3; вызывает неопределенное поведение , так как ptr не указывает ни на одну допустимую ячейку памяти.

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

Это , по-видимому, работает должным образом в вашем случае, что также является одним из самых опасных побочных эффектов неопределенного поведения.

Тем не менее, ptr имеет автоматическое хранение. Объем памяти, на который он будет указывать, будет зависеть от используемого распределения. Стандарт C не имеет понятия стека или кучи - это зависит от реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...