C 全局指针和悬挂指针 #包括 #包括 int*p; void f() { INTA=5; p=&a; printf(“%d”,*p); } void main() { f(); printf(“%d”,*p); }
为什么O/p是5?C 全局指针和悬挂指针 #包括 #包括 int*p; void f() { INTA=5; p=&a; printf(“%d”,*p); } void main() { f(); printf(“%d”,*p); },c,pointers,dangling-pointer,C,Pointers,Dangling Pointer,为什么O/p是5? 函数调用结束后,将删除局部变量a。因此p应该指向无效对象如果它是未定义的行为,那么它也可以(偶尔)给出5的输出。但是,如果第二天早上它给出6,不要感到惊讶。如果它是未定义的行为,那么它也可以(偶尔)给出5的输出。但如果第二天早上它发出6,也不要感到惊讶 为什么输出为5 这是因为一种叫做“的东西”。未定义的行为不一定总是提供错误的结果 函数调用结束后,将删除局部变量a。所以p应该指向无效对象 确切地说,它指向的是一个无效的对象,或者更好地说是根本没有对象-在函数f()中分配的a
函数调用结束后,将删除局部变量a。因此p应该指向无效对象如果它是未定义的行为,那么它也可以(偶尔)给出5的输出。但是,如果第二天早上它给出6,不要感到惊讶。如果它是未定义的行为,那么它也可以(偶尔)给出5的输出。但如果第二天早上它发出6,也不要感到惊讶 为什么输出为5 这是因为一种叫做“的东西”。未定义的行为不一定总是提供错误的结果 函数调用结束后,将删除局部变量
a
。所以p
应该指向无效对象
确切地说,它指向的是一个无效的对象,或者更好地说是根本没有对象-在函数f()
中分配的a
的int
对象在执行printf(“%d”,*p)时已经解除分配代码>在main()
中
使用存储地址解除对不再存在的对象的指针的引用是不正确的
它可以打印出任何东西。它打印出的5
只是一个幸运的机会,但永远不可靠。即使第二次执行完全相同的文件,也可能会得到不同的结果
为什么输出为5
这是因为一种叫做“的东西”。未定义的行为不一定总是提供错误的结果
函数调用结束后,将删除局部变量a
。所以p
应该指向无效对象
确切地说,它指向的是一个无效的对象,或者更好地说是根本没有对象-在函数f()
中分配的a
的int
对象在执行printf(“%d”,*p)时已经解除分配代码>在main()
中
使用存储地址解除对不再存在的对象的指针的引用是不正确的
它可以打印出任何东西。它打印出的5
只是一个幸运的机会,但永远不可靠。即使第二次执行完全相同的文件,也可能会得到不同的结果。因为未定义的行为不一定会出错。发生的事情没有定义,但它发生在工作中。如果在f()之间插入另一个函数调用代码>和printf(“%d”,*p)代码>您可能会得到不同的结果。从函数返回后,C不会浪费时间初始化本地数据;它就这样离开了。但请记住;当函数在作用域中时,其数据(属于函数的内存空间)将受到保护,以防被覆盖。但是,当代码指针点击函数的返回
行时,所有内存空间都会保留,但很容易被覆盖(不再受保护)。从函数返回后,main
可能打印也可能不打印5
,这取决于本地内存是否被覆盖。@aditi19如果您不理解的某个短语,请告诉我以改进它。已理解。。。感谢,因为未定义的行为不一定会出错。发生的事情没有定义,但它发生在工作中。如果在f()之间插入另一个函数调用代码>和printf(“%d”,*p)代码>您可能会得到不同的结果。从函数返回后,C不会浪费时间初始化本地数据;它就这样离开了。但请记住;当函数在作用域中时,其数据(属于函数的内存空间)将受到保护,以防被覆盖。但是,当代码指针点击函数的返回
行时,所有内存空间都会保留,但很容易被覆盖(不再受保护)。从函数返回后,main
可能打印也可能不打印5
,这取决于本地内存是否被覆盖。@aditi19如果您不理解的某个短语,请告诉我以改进它。已理解。。。谢谢
#include<stdio.h>
#include<stdlib.h>
int *p;
void f()
{
int a=5;
p=&a;
printf("%d ",*p);
}
void main()
{
f();
printf("%d",*p);
}