我目前正在学习 C 指针并试图了解一些行为。请看下面的代码片段
#include <stdio.h>
int *foo() {
int x = 7;
return (int *)x;
}
int main()
{
int *p = foo();
printf("%d", p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: 7
我想知道为什么要打印 7?在我的理解中 7 存储在堆栈上并(int *)x
返回指向堆栈内存的指针,当foo
返回“它的堆栈部分应该被清除”时,为什么p*
仍然指向7
. 发生这种情况是否是因为存储的内存7
尚未被其他数据覆盖或正在发生其他事情并且我完全误解了这种行为?对不起,如果你认为我的问题很愚蠢,我只是在学习 C
(int *)x
返回的不是指向的指针,x
而是x
转换为指针的值。从整数到指针的转换是实现定义的。然后在不取消引用指针的情况下打印指针的值(通过使用错误的格式说明符调用未定义的行为)。
在int
和int*
都是 4 字节长的典型环境中,整数和指针之间的转换只是使用相同的值,因此您的代码可能会输出正确的结果。