为什么我们不能在开始时将struct指针定义为null

时间:2014-01-14 16:03:34

标签: c struct

为什么我们不能在开头将结构指针定义为null。我总是要在程序中声明一个null指针。

在开始时将它们指向null并不是一件容易的事。为什么它最终会导致一些错误?

struct qwe
{
  int data;
  struct qwe *next=NULL;
};

或者这样

struct qwe
{
  int data;
  struct qwe *next;
  next=NULL;
};

我正在使用C语言&我这样做时会出错;

verify.c:8:22:错误:预期';'在声明清单的末尾     struct node * next = NULL;

这些是错误

jharvard@appliance (~): make verify
clang -ggdb3 -O0 -std=c99 -Wall -Werror    verify.c  -lcs50 -lm -o verify
verify.c:9:5: error: type name requires a specifier or qualifier
next=NULL;

verify.c:9:5: error: type specifier missing, defaults to 'int' [-Werror,-Wimplicit-int]
next=NULL;

verify.c:9:5: error: duplicate member 'next'

verify.c:8:18: note: previous declaration is here
struct node *next;
             ^
verify.c:9:9: error: expected ';' at end of declaration list
next=NULL;

3 个答案:

答案 0 :(得分:3)

因为结构只是一个定义内存如何划分的定义。如果你定义

struct a {
    uint8_t a1;
    uint8_t a2;
}

这将是内存中的16位,如果您访问a2成员,编译器会将其转换为特定位置。

现在,当您使用malloc()分配该结构时,malloc只获得它应分配的内存大小。它返回一个指向已分配内存的第一个字节的指针,它不知道这个内存如何分成几个较小的块。

答案 1 :(得分:2)

C没有构造函数的概念。在允许这种情况的语言中,赋值作为对象构造的一部分运行。

答案 2 :(得分:1)

您希望将定义初始化混合使用,这是您想要的方式,至少在C中是不可能的。为了规避此限制功能,例如< / p>

Foo* foo_new () {
// alloc and
// do your init code here
}
通常使用

代替。


在C ++中你可以使用你的类的构造函数。