为什么这个结构即使没有为它分配内存也能工作?
why does this structure work even without allocating memory for it?
我创建了 node
结构并在 main
中创建了相同的指针,但没有为 node structure
分配内存:struct node * first
或 struct 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):
- 正在写入受保护的内存,因此可能会崩溃。
- 写入未被其他任何东西使用的内存,所以可能没有效果。
- 写入其他任何东西使用的内存,这样事情就会以奇怪的、意想不到的方式发生变化。
未定义的行为,好吧,...未定义。这包括 似乎 可以正常工作的行为子集。但是,如果你依赖,你最终会遭受后果。
我创建了 node
结构并在 main
中创建了相同的指针,但没有为 node structure
分配内存:struct node * first
或 struct 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):
- 正在写入受保护的内存,因此可能会崩溃。
- 写入未被其他任何东西使用的内存,所以可能没有效果。
- 写入其他任何东西使用的内存,这样事情就会以奇怪的、意想不到的方式发生变化。
未定义的行为,好吧,...未定义。这包括 似乎 可以正常工作的行为子集。但是,如果你依赖,你最终会遭受后果。