我有一个包含两个相同类型的其他结构的结构,我想初始化它以启动两个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]
答案 0 :(得分:3)
你不能。 NULL是一个指针,其值设置为零,但您的mark
和space
属性不是指针值。在您拥有的代码中,它们都是值类型,作为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;
}