[英]Accessing uninitialized memory in c
#include<stdio.h>
int main(){
int i = 3;
int *k;
k = &i;
k++;
printf("%d ",*k);
return 0;
}
Output:垃圾值
#include<stdio.h>
int main(){
int i = 3;
int *j;
int **k;
j = &i;
k = &j;
k++;
printf("%d ",**k);
return 0;
}
Output:运行时错误
在这两个程序中,k 都是一个指针变量,它访问未初始化的 memory。 我的问题是为什么它在第二个程序中作为运行时错误返回
在第一个示例中, k++
在i
之后递增k
以指向 memory 。 虽然访问此 memory 不是由 C 定义的,但在常见的实现中(特别是在编译器的优化没有显着改变代码的情况下), i
存储在堆栈中。 该堆栈也用于其他用途,因此在i
之前和之后还有其他可访问的 memory ,并且使用*k
可能会从此 memory 获取数据。
在第二个示例中, k++
递增k
以指向j
之后的 memory 。 然后*j
可以从这个 memory 中获取数据,与第一个示例一样。 然后**j
可以使用该数据作为访问其他 memory 的指针。 但*j
的内容一般不是有意义的地址。 很可能,它们形成的地址未映射到进程的虚拟 memory 空间中。 尝试访问该地址会导致硬件产生故障。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.