指针给出了意想不到的价值

Mur*_*hna -4 c pointers initialization undefined-behavior

void first(){
    int x;
    int *p;
    p= &x;
    scanf("%d",p);
    printf("The value in x or *p is: %d\n",x);
}


void second(){
    int x;
    int *ptr;
    scanf("%d",&x);
    printf("The value in *ptr is: %d\n",*ptr);
}


int main(){
    first();
    second();
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,second()函数是miss行为.我为x赋值的变量*ptr以及x 赋予了什么值.为什么?

dbu*_*ush 6

您没有分配p值,因此它仍然未初始化.试图取消引用该指针调用未定义的行为.

给出p一个值,你就会得到你期望的结果:

int *p = &x;
Run Code Online (Sandbox Code Playgroud)

您的代码仍在打印正确值的事实是该未定义行为的一部分.未定义行为可以表现出的方​​式之一是代码似乎正常工作,但是看似无关的更改将导致它中断.

在这种特殊情况下,函数first和second每个函数定义相同类型和相同顺序的2个局部变量.调用后first完成,包含的值内存x和p从功能仍然包含这些值,但没有出现过其他函数调用尚未覆盖它们.

当你之后second立即打电话first.变量x和ptr在second最终使用同样的内存x和p中first.因为ptr它是未初始化的,它仍然包含旧值,它首先是地址x,恰好与xin 的地址相同second.

同样,这是未定义的行为,因此您不能一直依赖于这种情况.如果你first在first和之间添加另一个变量或调用另一个函数second,那将修改之前使用的堆栈内存first.然后,内存将包含一些其他值,您可能会打印垃圾值或核心转储.

如果使用不同的编译器或不同的编译器选项编译,相同的代码可能会给出不同的结 例如,另一个编译器可能选择将每个函数中的变量以不同的顺序放在堆栈上,或者它可以决定在函数返回后将函数使用的堆栈清零.