指针在这里如何工作?

时间:2015-02-09 18:54:12

标签: c pointers

如果在控件返回main()之后,如果从堆栈中删除了i,那么该代码如何工作?如果值仍然是5,那么该值仍然是5,因为main()和指针所指向的变量不存在不存在

#include<stdio.h>

int* sum() {
    int i=5;
    int*a=&i;
    printf("%d\n",a);
    return a;
}

int main() {
    int* a=sum();
    printf("%d\n",a);
    printf("%d",*a);
}

输出:

2293252
2293252
5

2 个答案:

答案 0 :(得分:6)

你看到的是未定义的行为。

将函数导联中的局部变量的地址返回到未定义的行为。

因此结果可能并非在所有平台上都符合预期。

int i=5;

是一个局部变量,您返回此变量的地址。 退出函数后,此变量不再有效,因此在其范围之外访问它是未定义的行为。不应从函数返回存储此局部变量的地址。或者你可以做

int* sum()
{
    int*a =  malloc(sizeof(int));
    *a = 5;
    printf("%d\n",*a);
    return a;
}

PS:printf("%p",(void*)a);应该用于打印指针,使用错误的格式说明符导致未定义的行为。

答案 1 :(得分:0)

从堆栈中删除变量之后,它没有被清除,但是它可以被程序的其他变量自由使用或者被释放并返回到操作系统,所以如果你和你的操作系统不使用这个空间它&# 39; s包含您之前的值。如果操作系统空闲页面包含引用该地址的此地址会导致分段错误。如果你在平均时间内使用堆,事情会变得更复杂。