check the image of program on turbo c++
#include< stdio.h>
struct node {
int data;
};
int main() {
struct node *ptr;
ptr->data=3;
printf("%d",ptr->data);
return 0;
}
输出:3
我的问题是,即使我尚未声明结构节点的实例。
例如struct节点n;
我还没有使用malloc为ptr分配内存,它仍然为ptr-> data分配空间。为什么? 它不应该只是为堆栈上的地址ptr分配内存。
在堆栈或堆上分配用于数据的内存字段的位置。---------
答案 0 :(得分:10)
在您的代码中,ptr->data=3;
会调用undefined behavior,因为ptr
不会指向任何有效的内存位置。
在尝试取消引用之前,您需要确保ptr
指向有效的内存位置。
看来 在您的情况下正常工作,这也是未定义行为最危险的副作用之一。
也就是说,ptr
具有自动存储功能。它指向的内存将取决于所使用的分配。 C标准没有堆栈或堆的概念-取决于实现。
答案 1 :(得分:3)
我还没有使用malloc为ptr分配内存,它仍然为ptr-> data分配空间。
没有分配任何东西。如果没有初始化程序,ptr
的值为不确定,在这种情况下,发生指向您可以写入的内存,而不会立即导致程序崩溃。您设法不覆盖任何“重要”的东西,但这比其他任何事情都要幸运。
在声明指针时,应该养成初始化指针的习惯,无论是NULL
还是&
运算符的结果,或者是malloc
/ {{ 1}} / calloc
通话。
答案 2 :(得分:0)
创建指针struct node *ptr;
时,它将被放置在堆栈中。
放置此变量的位置可以在堆栈中的任何位置。
例如,将其放置在地址0x100上。
将变量放在该位置上时,那里的数据未设置为0。
例如,在地址0x100
上是数据0x200
,您将有一个struct node *ptr
指向地址0x200
。
然后,此时您正在执行以下ptr->data=3;
,因为代码认为在地址0x200处放置了struct node
,它将在其中填充变量data
。因此,将在地址0x200上写入值3
。
如果您很幸运(实际上并不是真正的幸运,因为以后可能会引起很多问题),在地址3
上写入值0x200
不会造成任何问题问题,因为未使用地址0x200
上的内存。
但是请记住,您的代码仅认为struct node
被放置在该位置,但是实际上没有,因此任何其他变量都可以在该位置。并且当该地址上有其他变量时。当您将值3
写入该地址时,您正在覆盖该变量的值。这可能会在您的代码中产生一些非常奇怪的行为。