为什么这个结构即使没有为它分配内存也能工作?

why does this structure work even without allocating memory for it?

我创建了 node 结构并在 main 中创建了相同的指针,但没有为 node structure 分配内存:struct node * firststruct node * second (应该动态分配 - malloc/calloc)。相反,我能够访问数据(或结构内存)

#include<stdio.h>
struct node{
    int data;
    struct node *next;
};
void Traverse(struct node * head){
    while (head!=NULL)
    {
        printf("Data:%d\n", head->data);
        head=head->next;
    }
}
int main()
{
    struct node * first;
    struct node * second;
    first->data=33;
    first->next=second;

    second->data=45;
    second->next=NULL;

    Traverse(first);
    return 0;

}

目前我 运行 VS Code 中的这段代码是自动执行的 VS Code 还是内部发生的其他事情?

欢迎来到 undefined behavior 的土地。

C 在使用指针之前不对数组执行任何绑定检查或检查指针是否有效。这是使 C 语言快速的部分原因。该语言相信用户会遵守规则,而无需明确强制执行。所以当你违反规则时,你可能会“被抓”,也可能不会。

在这种情况下,您很“幸运”您的代码恰好可以工作,但不能保证一定会是这样。您可以进行看似无关的更改,例如添加对 printf 的调用以进行调试或添加未使用的局部变量,然后您的代码突然崩溃。

如果您对“工作”的定义是“尽管实际上不应该,但看起来似乎还不错”那么,是的,它可以工作。但是,我认为“作品”的正确定义应该在其中某处包含术语“可靠”:-)

你在那里做的是未定义的行为。此代码具体(在函数内部,因此使用自动变量):

struct node * first;
first->data = 33;

将为 first 分配一个 任意 值,这在将数据分配给它指向的内存时可能会或可能不会失败。但是,无论失败与否,这仍然是错误的做法。可能的结果包括 (non-exhaustive):

  • 正在写入受保护的内存,因此可能会崩溃。
  • 写入未被其他任何东西使用的内存,所以可能没有效果。
  • 写入其他任何东西使用的内存,这样事情就会以奇怪的、意想不到的方式发生变化。

未定义的行为,好吧,...未定义。这包括 似乎 可以正常工作的行为子集。但是,如果你依赖,你最终会遭受后果。