【发布时间】:2014-02-10 14:34:00
【问题描述】:
下面的程序运行良好
#include <stdio.h>
#include <string.h>
int * p(void);
main()
{
int *x = p();
printf("%d", *x);
}
int * p(void)
{
int x;
x=10;
return (&x);
}
但是,如果我像这样修改上面的程序
#include <stdio.h>
#include <string.h>
int * p(void);
main()
{
int *x = p();
printf("%d", *x);
}
int * p(void)
{
int *x;
*x=10;
return (x);
}
在执行上述代码时,会引发分段错误。
谁能解释这种行为?
【问题讨论】:
-
您说运行良好的程序具有未定义的行为(它有问题)。在其生命周期结束后使用左值(在本例中为局部变量
x)是未定义的行为,如果幸运的话,它会在测试期间崩溃,因此您可以修复错误。它不会崩溃的事实只是该错误的一种可能表现。 -
您在第二种情况下传递局部变量的地址。这将导致未定义的行为。
-
@kripanand 这是第一种传递局部变量地址的情况,而不是第二种情况,它取消引用未初始化/未分配的指针。
-
@moeCake 你是对的。正如在第二种情况下已经回答的那样,没有分配地址并且值被写入某个随机地址,这导致了 seg。故障
标签: c