Почему malloc указателя на структуру работает?

В коде, который я случайно использовал

list* Head = malloc(sizeof(list*)); 

вместо правильного

  list* Head = malloc(sizeof(list)); 

для создания нового узла типа list но в дальнейшем он работал отлично.

Поэтому мой вопрос, почему он работал правильно?

    Идея здесь заключается в том, что malloc() не имеет понятия (тип / размер) или отношение к переменной, которой будет присвоено возвращаемое значение. Он принимает входной аргумент, выделяет память запрошенного размера и возвращает указатель на блок памяти, вот и все. Итак, в случае, если вы запросили ошибочный размер блока памяти, malloc() имеет ничего, что помешало бы вам это сделать. После использования возвращаемого указателя вы либо будете

    • теряя память, когда выделенный размер больше, чем требуется для типа цели.
    • вызывают неопределенное поведение путем доступа к внешней памяти, когда запрашиваемый размер меньше требуемого в соответствии с типом цели.

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


    Совет:

    Чтобы избежать подобных ошибок, используйте формат

      type * variable = malloc(sizeof *variable); 

    в этом случае у вас есть два преимущества:

    1. Ваше утверждение развязано с типом переменной.
    2. Шансы замаскировать требуемый размер меньше.