-2

可能重复:
在 C++ 中声明指向 struct 的指针会自动为其成员分配内存。我错了吗?

假设我将结构 Human 定义为:

struct Human{int year, Human* Mom};

做表达

Human* Bob;

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

Bob == NULL

是假的;这是否意味着上面的表达式创建了对象 Human 的静态记忆?

另外,我注意到

Bob->year 

不会自动初始化为 0,但是

Bob->Mom 

正在初始化为NULL,这是为什么呢?

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

Human* Bob = new Human;

然后我发现

Bob->Mom

不再是NULL,这是怎么回事?

4

5 回答 5

1

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

struct Human { int year; Human *Mom; };

该声明:

Human *Bob;

然后创建一个存储位置,但如果它是在函数内部创建的,则不会对其进行初始化。如果是全局作用域,会被初始化为零(NULL),但你说Bob == NULL的是假的,所以它一定是一个未初始化的局部变量。它没有指向任何东西。除了作为赋值的目标之外,任何使用它都会调用未定义的行为,因为 in 的值Bob是未定义的。

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

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

Human *Bob = new Human;

你没有提供一个,系统也不需要提供一个,所以指向的对象是未初始化的。

于 2012-12-12T03:05:20.167 回答
0

在您的代码中,您给编译器的唯一指令是创建一个指针(32 位或 64 位变量),您打算将其指向“人类”类型的结构。

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

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

你应该做的是:

Human* Bob = new Human();

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

于 2012-12-12T03:11:12.090 回答
0

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

在分配方面,您已经定义了递归或自引用数据结构。考虑一下如果它确实为该Mom成员的另一个 Human 分配了内存会发生什么;然后它必须分配另一个 HumanBob->Mom->Mom等等......

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

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

struct Human { 
    int year; 
    Human *Mom; 
    Human() : year(0), Mom(NULL) {}
};
于 2012-12-12T03:03:09.820 回答
0

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

于 2012-12-12T03:03:25.133 回答
0

表达 Human* Bob;自动为 Bob 和它指向的 Human 对象分配内存?因为我注意到 Bob==NULL 是假的;这是否意味着上面的表达式创建了对象 Human 的静态记忆?

不,它没有。Bob 没有初始化,所以只会指向一些随机垃圾。您必须为 Bob 显式分配内存。

另一件事,如果我动态分配内存,例如 Human* Bob=new Human; 然后发现Bob->Mom不再是NULL了,这是怎么回事呢?

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

于 2012-12-12T03:04:51.763 回答