В коде, который я случайно использовал
list* Head = malloc(sizeof(list*));
вместо правильного
list* Head = malloc(sizeof(list));
для создания нового узла типа list
но в дальнейшем он работал отлично.
Поэтому мой вопрос, почему он работал правильно?
Идея здесь заключается в том, что malloc()
не имеет понятия (тип / размер) или отношение к переменной, которой будет присвоено возвращаемое значение. Он принимает входной аргумент, выделяет память запрошенного размера и возвращает указатель на блок памяти, вот и все. Итак, в случае, если вы запросили ошибочный размер блока памяти, malloc()
имеет ничего, что помешало бы вам это сделать. После использования возвращаемого указателя вы либо будете
Теперь, в любом случае, вы можете видеть, что он работает правильно . Первое несколько допустимо (хотя этого следует избегать), но позже это строгое отсутствие.
Совет:
Чтобы избежать подобных ошибок, используйте формат
type * variable = malloc(sizeof *variable);
в этом случае у вас есть два преимущества: