Как выделение кучи указателя выделяет достаточно места для структуры в C? - PullRequest
0 голосов
/ 05 июня 2019

Следующий код компилируется и отлично работает:

typedef struct n {
    char value;
    struct n* next;
} node;
void insert_new_node(node** head, char new_value)
{
    node* new_node = malloc(sizeof(node*));
    new_node->value = new_value;
    new_node->next = NULL;

    if(*head == NULL)
    {
        *head = new_node;
    }
    else
    {
        node* current = *head;

        while(current->next != NULL)
        {
            current = current->next;
        }

        current->next = new_node;
    }
}

Мой вопрос - обратите внимание, что я на самом деле только маллок место для указатель на структуру ... Не для структурысам (ref: node* new_node = malloc(sizeof(node*));).Итак, мой вопрос: где эти структурные данные на самом деле хранятся и если они хранятся в куче, как это работает?

1 Ответ

5 голосов
/ 05 июня 2019

Итак, мой вопрос: где на самом деле хранятся эти данные структуры и, если они хранятся в куче, как это работает?

Это кажется для работы, доступ к недопустимой памяти равен неопределенное поведение (UB) . Не делай этого.

Чтобы уточнить, как вы упоминаете, вы выделили память только размером указателя, однако вы используете этот указатель для доступа к памяти за этой границей. Расположение памяти вне выделенного блока не выделено вашей программе, поэтому память недопустима в контексте вашей программы, и попытка доступа к памяти - UB.

Исходя из индивидуального сценария, это может привести к

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

любой или все, без определенного порядка.

...