Как инициализировать структуру до null?



У меня есть структура, которая содержит две другие структуры того же типа, и я хочу инициализировать ее, чтобы иметь оба NULL для запуска. Как мне это сделать? Я пробовал ниже, но получаю предупреждения компилятора с gcc.



#include <stdio.h>

typedef struct Segment {
int microseconds;
} Segment;

typedef struct Pair {
Segment mark;
Segment space;
} Pair;

int main()
{
Pair mark_and_space = { .mark = NULL, .space = NULL };

return 0;
}


И предупреждения компилятора:



main.c:14:5: warning: initialization makes integer from pointer without a cast [enabled by default]                                                   
Pair mark_and_space = { NULL, NULL };
^
main.c:14:5: warning: (near initialization for 'mark_and_space.mark.microseconds') [enabled by default]

main.c:14:5: warning: initialization makes integer from pointer without a cast [enabled by default]
main.c:14:5: warning: (near initialization for 'mark_and_space.space.microseconds') [enabled by default]
640   7  

7 ответов:

Для того, чтобы интиализовать две субструктуры, каждая из которых содержит один член int к тому, что ближе всего к NULL, т. е. init all ints to "0", можно использовать следующий код:

#include <stdio.h>

typedef struct Segment {
    int microseconds;
} Segment;

typedef struct Pair {
    Segment mark;
    Segment space;
} Pair;

int main(void)
{
    Pair mark_and_space = { {0}, {0} };

    return 0;
}

Если вы хотите инициализировать их в NULL, предполагая, что вы думаете об указателях, которые являются единственной вещью, которая может быть чисто интиализирована в NULL, то посмотрите другие ответы, которые в основном говорят: "если вы хотите инициализировать значения указателей, то init указатели, а не ints".

NULL-это указатель, значение которого равно нулю, но ваши свойства mark и space не являются значениями указателя. В вашем коде, как у вас есть, они оба будут типами значений, выделенными как часть вашей структуры Pair.

Измените переменные на Segment * вместо Segment, и вы сможете установить для них значение NULL.

Вы получаете эти ошибки, потому что NULL - указатель. Вы не можете назначить указатель на Segment. Способ исправить это-изменить пару Segments на Segment *s вместо этого. Но тогда вы будете отвечать за выделение памяти.

Поскольку парные поля не являются указателями, NULL не является хорошим выбором для инициализации структуры. Но если вы хотите просто установить поля равными нулю, вы можете попробовать использовать больше фигурных скобок:

Pair mark_and_space = { .mark = {3}, .space = {0} };

Эту строку мой компилятор MinGW выполнил без всякого предупреждения. Я установил mark.milliseconds в 3 только для примера, как установить произвольное начальное значение для внутреннего поля миллисекунд.

#include <stdio.h>

typedef struct Segment {
    int microseconds;
} Segment;

typedef struct Pair {
    Segment mark;
    Segment space;
} Pair;

int main()
{
    Pair mark_and_space = { .mark.microseconds = (int) NULL, 
                            .space.microseconds =(int) NULL };
    return 0;
}

Игнорируя все остальные ответы, если вы все еще хотите установить его в ноль.

Вы не можете инициализировать структуру до null. Однако вы можете инициализировать указатель структуры в null. В соответствии со стандартом POSIX (Курсив мой):

NULL

Нулевая константа указателя. [CX] ⌦макрос расширяется до целого постоянного выражения с значением 0, приведенным к типу void *.

Обратите внимание на этот тип и на то, почему он несовместим с вашим определением. Вы можете либо изменить члены на Segment *malloc Ваш сами переменные стека), или вы можете статически инициализировать их:
Pair mark_and_space = { { }, { } };
/* v---------------------^    ^
  default to 0, but you can choose different value(s) */
int main()
{
    Pair mark_and_space;
    mark_and_space.mark = NULL;
    mark_and_space.space = NULL;
    return 0;
}

Comments

    Ничего не найдено.