繁体   English   中英

在 c 中访问未初始化的 memory

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM