C 如何为结构成员分配NULL

C 如何为结构成员分配NULL,c,C,这是密码 struct stack { int item; struct stack *next=NULL; }; 我想使指针最初指向null,但这显示了错误 错误:应为“:”,“,”,“;”,“}”或“=”标记之前的“属性” 创建该类型的变量,然后将初始化值放在大括号中 struct stack { int item; struct stack *next; } stackVar = { 0, NULL}; 发布的片段没有定义对象,它定义了一个类型 在C

这是密码

struct stack {
    int item;
    struct stack *next=NULL;
};
我想使指针最初指向null,但这显示了错误

错误:应为“:”,“,”,“;”,“}”或“=”标记之前的“属性”


创建该类型的变量,然后将初始化值放在大括号中

struct stack 
{
    int item;
    struct stack *next;

} stackVar = { 0, NULL};

发布的片段没有定义对象,它定义了一个类型

在C语言中,不能在类型定义中指定成员的默认值。可以在初始值设定项中指定成员的值:

struct stack {
    int item;
    struct stack *next;
};

struct stack my_stack = { 0, NULL };
如果省略初始值设定项中的最后一个成员,它将被初始化为其类型的零,
NULL
指针:

struct stack my_stack = { 0 };  // my_stack.next is NULL

不能在结构定义内执行初始化。您可以按如下方式初始化堆栈:

struct stack {
    int item;
    struct stack* next;
};

int main(){
    struct stack s = {0,NULL};
}

不能要求结构类型自行将该指针设置为null。每次创建类型为
struct stack
的对象时,都必须显式执行此操作,例如

struct stack my_stack = { .next = NULL };

这两种变体具有相同的效果-它们将
my_stack
的所有字段设置为零

如果您在动态内存中创建
struct stack
对象,那么初始化语法是毫无疑问的。您必须显式地将初始值指定给新创建的对象,例如

struct stack *my_stack = malloc(sizeof *my_stack);
my_stack->next = NULL;


这是因为你不能在C.做这件事,你可以从C++ 11中做这件事(甚至不是C)。也许你需要切换到C++来使用默认构造函数。记住,C没有构造函数。您希望什么时候进行这种初始化?需要一本好书。在定义这种类型的变量时<代码>结构堆栈堆={0,NULL}最后介绍的两个备选方案之间存在细微差别:
我的堆栈->项在第一种情况下未初始化。@chqrlie是的,我特别尝试匹配OP的意图:仅初始化
下一个
。从这个意义上说,这个版本是唯一一个提供精确匹配的版本,而其他版本在形式上是“过度的”。这是一个很好的观点,但考虑到OP的技能水平,我怀疑他的意思是否如此精确。
struct stack *my_stack = malloc(sizeof *my_stack);
my_stack->next = NULL;
struct stack *my_stack = malloc(sizeof *my_stack);
*my_stack = (struct stack) { 0 };
// or 
*my_stack = (struct stack) { .next = NULL };