C++ 声明指针时的隐式内存分配和初始化

C++ 声明指针时的隐式内存分配和初始化,c++,pointers,struct,declaration,allocation,C++,Pointers,Struct,Declaration,Allocation,可能重复: 如果我将人的结构定义为: struct Human{int year, Human* Mom}; 这个表达是什么意思 Human* Bob; 自动为Bob和它所指向的人类对象分配内存? 因为我注意到了 Bob == NULL Bob->year 是假的; 这是否意味着上述表达式创建了人类对象的静态内存 还有,我注意到 Bob == NULL Bob->year 未自动初始化为0,但 Bob->Mom 正在初始化为NULL,为什么 另一件事,如果

可能重复:

如果我将人的结构定义为:

struct Human{int year, Human* Mom};
这个表达是什么意思

Human* Bob;
自动为Bob和它所指向的人类对象分配内存? 因为我注意到了

Bob == NULL
Bob->year 
是假的; 这是否意味着上述表达式创建了人类对象的静态内存

还有,我注意到

Bob == NULL
Bob->year 
未自动初始化为0,但

Bob->Mom 
正在初始化为NULL,为什么

另一件事,如果我动态分配内存,例如

Human* Bob = new Human;
然后我发现

Bob->Mom

不再为NULL,这是如何发生的?

初始化指针值是您的责任。除非您将它们设置为某种值(如
0
NULL
),否则它们的值未定义,并且您可能会在每个相应的分配中获得不同的未初始化指针值

在分配方面,您已经定义了递归或自引用数据结构。考虑一下,如果它确实为“<代码>妈妈< /代码>成员”分配额外的内存,会发生什么情况;然后它必须为
Bob->Mom->Mom
分配另一个人,以此类推

所以,没有。只分配了一个人。任何本机指针都只是一个内存地址位置,仅此而已

如果使用构造函数,您可以使指针初始化更容易:

struct Human { 
    int year; 
    Human *Mom; 
    Human() : year(0), Mom(NULL) {}
};

不,它不分配内存。Bob是一个带有垃圾值的指针,所以谁知道它指向的是什么

表达方式是人*Bob;自动为Bob和它所指向的人类对象分配内存?因为我注意到Bob==NULL是false;这是否意味着上述表达式创建了人类对象的静态内存

不,没有。Bob没有初始化,因此将指向一些随机垃圾。您必须显式地为Bob分配内存

另一件事,如果我动态分配内存,例如:Human*Bob=newhuman;然后我发现Bob->Mom不再为空,这是怎么发生的


如上所述,未初始化的内存中可能有任何内容。试图跟随指针将导致灾难。最佳做法是初始化所有指向
NULL
的指针,或立即将它们指向分配的内存块。

至少应将结构声明更正为:

struct Human { int year; Human *Mom; };
声明:

Human *Bob;
然后创建一个存储位置,但如果它是在函数中创建的,则不会初始化它。如果它在全局范围内,它将被初始化为零(NULL),但您说的
Bob==NULL
为false,因此它必须是未初始化的局部变量。它没有指向任何东西。将其用作赋值的目标以外的任何用途都会调用未定义的行为,因为
Bob
中的值未定义

没有;显示的定义没有为指向的
Bob
分配存储

其他观察结果都取决于运行时系统的特性。因为行为是未定义的,任何事情都可能发生,根据标准,它是“正常”的。您需要该类型的默认构造函数,以便在使用时合理地设置值:

Human *Bob = new Human;

您没有提供指针,系统也不需要提供指针,因此指向的对象是未初始化的。

在您的代码中,您给编译器的唯一指令是创建一个指针(32位或64位变量),您希望该指针指向“Human”类型的结构

由于您尚未初始化指针,它的值很可能是内存空间中的值—可能是0(NULL)或其他任何值

当您调用Bob->Mom时,您正在解引用指针(Bob)并查看内存中任意的区域(可能是不允许访问的空间)。您很可能会遇到分段错误(在*nix机器上)

你应该做的是:

Human* Bob = new Human();

这将为结构创建专用空间,并返回该结构的地址并将其分配给指针。现在,当您解除对Bob的引用时,它实际上将指向专门为人类结构分配的空间。

Bob
未初始化。试图弄清楚它在做什么是毫无意义的。-1给定的代码,例如
struct Human{int year,Human*Mom},不会编译,也不是真正的代码。你应该在书中找到这些基本而简单的问题,而不是在那里。@chris:因为它在语法上是无效的。您链接到的代码不是发布的代码,而是其他一些代码。你为什么要链接到其他代码,假装那是OP的代码,如果不是为了拖拉的话。@Cheersandhth.-Alf,对不起,我刚刚意识到里面有个逗号。我自己把简短的样本打了出来,而不是切换回去复制粘贴。我明白你的意思。起初我以为你指的是人类的母亲部分,所以我的测试是检查。你有章节/诗句吗?我在标准的任何地方都找不到“垃圾值”。@CrazyEddie,《创世记》1:1:一开始,有垃圾。未定义。见6.2.4