【问题标题】:Accessing uninitialized memory in c在c中访问未初始化的内存
【发布时间】:2022-01-13 11:34:51
【问题描述】:
#include<stdio.h>
int main(){
    int i = 3;
    int *k;
    k = &i;
    k++;
    printf("%d ",*k);
    return 0;
}

输出:垃圾值

#include<stdio.h>
int main(){
   int i = 3;
   int *j;
   int **k;
   j = &i;
   k = &j;
   k++;
   printf("%d ",**k);
   return 0;
}

输出:运行时错误

在这两个程序中,k 都是一个指针变量,它访问未初始化的内存。 我的问题是为什么它在第二个程序中返回为运行时错误

【问题讨论】:

  • 这是未定义的行为。你得到你得到的。
  • 虽然这都是未定义的行为,但取消引用垃圾指针比取消非一指针更可能导致某种运行时错误。在第二个*k 是一个垃圾指针值,所以**k 取消引用一个垃圾指针。

标签: c pointers memory memory-management double-pointer


【解决方案1】:

在第一个示例中,k++ 递增 k 以指向 i 之后的内存。虽然访问此内存不是由 C 定义的,但在常见的实现中(特别是在编译器的优化没有显着改变代码的情况下),i 存储在堆栈中。栈也用于其他用途,所以i前后还有其他可访问的内存,使用*k可能会从这块内存中获取数据。

在第二个示例中,k++ 递增 k 以指向 j 之后的内存。然后*j 可以从这个内存中获取数据,就像第一个例子一样。然后**j 可以使用该数据作为访问其他内存的指针。但是*j 的内容一般不是一个有意义的地址。很可能,它们形成了一个未映射到进程的虚拟内存空间中的地址。尝试访问该地址会导致硬件产生故障。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2020-07-28
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多