C - значение по умолчанию для указателя в структуре - PullRequest
3 голосов
/ 06 мая 2011

У меня есть следующая очень упрощенная реализация для единственного связанного списка в C:

typedef struct Node{
        int data;
    struct Node *next;  
} node;


void printLL(node * start);
void addNode(node * head, node * add);

int main()
{
    node first;
    first.data = 99;
    first.next = NULL;

    node second;
    second.data = 11;

    addNode(&first, &second);   
    printLL(&first);    
}

void addNode(node * head, node * add)
{
    if(head->next)
    {
        addNode(head->next, add);
    }
    else 
    {
        head->next = add;
    }
}

void printLL(node * start)
{
    printf("Data is %d\n", start->data);
    if (start->next) {
        printLL(start->next);
    }
}

Что меня смущает, так это то, что если я не установлю first.next = NULL, я получуошибка EXE_BAD_ACCESS.Это происходит, когда я пытаюсь проверить, установлено ли это свойство или нет, чтобы определить, следует ли делать вызов рекурсивно.Другая вещь, которую я не понимаю, это то, что если я установил first.next, чтобы он указывал на «second», все функции работали, хотя для «second» я не установил явно, что он рядом с NULL.Поэтому кажется, что в значении по умолчанию для указателя, определенного в структуре, есть некоторая несогласованность.Конечно, я, вероятно, делаю что-то совершенно не так, но был бы признателен, если бы кто-то смог пролить свет на этот вопрос.Чтобы свести все к нулю, мои вопросы:

  1. Какое значение по умолчанию для указателя, определенного в структуре?
  2. При условии отсутствия значения по умолчанию, существует ли простой способ установить значение по умолчанию в определении структур?(Я просмотрел несколько книг на Си и не смог найти ответ на этот вопрос)

Ответы [ 8 ]

2 голосов
/ 06 мая 2011

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

В этом и заключается проблема - компилятор не устанавливает автоматический (local) переменная для любого значения по умолчанию.Таким образом, вы можете получить что-то, что приводит к EXE_BAD_ACCESS, или вы можете получить что-то, что, кажется, работает.Удача в розыгрыше (и это ошибка, даже если она работает).

Один из недостатков C состоит в том, что вы несете ответственность за правильную инициализацию переменных.Компилятор может помочь с предупреждениями, не все компиляторы так же хороши, как другие.

Есть ли простой способ установить значение по умолчанию в определении структур?

Нет способа сделать это в определении структуры.Однако вы можете инициализировать структуру, когда объявлена ​​переменная этого типа:

node first = { 99, NULL };
1 голос
/ 06 мая 2011

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

0 голосов
/ 06 мая 2011

Автоматические переменные вообще не инициализируются в C, независимо от того, являются они struct или нет.Вы должны инициализировать их самостоятельно.

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

node first = { .data = 99 };

сделал бы свое дело.next гарантированно будет правильно инициализировано.(Если у вас нет C99, пропустите .data = и надеемся, что вы никогда не измените макет вашего struct:)

Также обратите внимание, что это может отличаться от обнуления struct с помощью memset или около того.На некоторых архитектурах шаблон 0 битов может быть неправильной инициализацией для нулевого указателя или double.Так что лучше придерживайтесь того, что сам язык предоставляет в качестве механизма инициализации.

0 голосов
/ 06 мая 2011

Нет значения по умолчанию.Каждая ячейка памяти будет сохранять любое значение, если оно явно не изменено.Хотя само это поведение зависит от компилятора.Суть в том, что вы не можете предполагать, что оно будет содержать определенное значение.

Чтобы установить значение по умолчанию, рекомендуется явно присваивать значения атрибутам struct при каждом создании его экземпляра.1004 *

Если бы вы использовали C++, у вас были бы конструкторы, в которых вы бы / должны были установить значения по умолчанию для членов.

0 голосов
/ 06 мая 2011

Если вам нужны значения указателя по умолчанию, вы можете создать фабричный метод, который возвращает новый экземпляр структуры со значениями, установленными на желаемые значения по умолчанию.

0 голосов
/ 06 мая 2011

При вызове addNode(&first, &second); в состоянии if вы выполняете head->next, что и вызывает проблемы. next не инициализируется по умолчанию и вызывает EXE_BAD_ACCESS во время выполнения.

Но когда вы установите его на NULL , условие в операторе if не будет выполнено и приведет вас к оператору else, где вы фактически назначаете указатель.

0 голосов
/ 06 мая 2011

Нет значения по умолчанию для чего-либо в структуре (если оно не создано статически).И нет способа предоставить один - если вы хотите, вы должны использовать C ++, который предоставляет конструкторы, чтобы сделать именно это.Если придерживаться C, вам нужно явно инициализировать структуру.

0 голосов
/ 06 мая 2011

Значения по умолчанию могут зависеть от компилятора C, поэтому лучше предоставить их.

Вы должны начать его после того, как создали свой экземпляр структуры, такой как second.next = NULL.

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