如何将结构初始化为null?

时间:2017-08-21 23:35:37

标签: c struct

我有一个包含两个相同类型的其他结构的结构,我想初始化它以启动两个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] 

7 个答案:

答案 0 :(得分:3)

你不能。 NULL是一个指针,其值设置为零,但您的markspace属性不是指针值。在您拥有的代码中,它们都是值类型,作为Pair结构的一部分进行分配。

将变量更改为Segment *而不是Segment,您可以将它们设置为NULL。

答案 1 :(得分:2)

为了初始化两个子结构,每个子结构包含一个int成员到最接近NULL的结构,即init all int为“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,假设你想到指针,这是唯一可以干净利落地归零的东西,那么看看其他答案,基本上说“如果你想初始化指针值,然后初始化指针,而不是整数“。

答案 2 :(得分:0)

您正在收到这些错误,因为NULL是指针。您无法指定Segment的指针。解决此问题的方法是将Segment对更改为Segment *。但是你将负责内存分配。

答案 3 :(得分:0)

由于Pair字段不是指针,因此NULL不是初始化结构的好选择。但是,如果您只想将字段设置为零,则可以尝试使用更多大括号:

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

我的MinGW编译器在没有任何警告的情况下编译了这一行。我将mark.milliseconds设置为3,例如,如何将任意初始值设置为内部毫秒字段。

答案 4 :(得分:0)

您无法将结构初始化为null。但是,您可以将结构指针初始化为null。根据{{​​3}}(强调我的):

  

NULL

     

空指针常量。 [CX] ⌦宏应扩展为整数常量表达式,其中值0强制转换为void *

请注意那里的类型,以及它与您的定义不兼容的原因。您可以将成员更改为Segment *(以及自己的malloc堆栈变量),也可以静态初始化它们:

Pair mark_and_space = { { }, { } };
/* v---------------------^    ^
  default to 0, but you can choose different value(s) */

答案 5 :(得分:0)

#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,请忽略所有其他答案。

答案 6 :(得分:0)

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