Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 全局指针和悬挂指针 #包括 #包括 int*p; void f() { INTA=5; p=&a; printf(“%d”,*p); } void main() { f(); printf(“%d”,*p); }_C_Pointers_Dangling Pointer - Fatal编程技术网

C 全局指针和悬挂指针 #包括 #包括 int*p; void f() { INTA=5; p=&a; printf(“%d”,*p); } void main() { f(); printf(“%d”,*p); }

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

为什么O/p是5?
函数调用结束后,将删除局部变量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);
}