指向结构的指针声明是否会为其成员分配内存?

时间:2018-11-01 13:47:10

标签: c pointers

check the image of program on turbo c++

output of program

#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分配内存。

在堆栈或堆上分配用于数据的内存字段的位置。---------

3 个答案:

答案 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写入该地址时,您正在覆盖该变量的值。这可能会在您的代码中产生一些非常奇怪的行为。