分段故障结果

时间:2013-02-12 13:01:31

标签: c linux

我试图在桌面上安装的Linux上以及安装在虚拟机中的相同Linux上执行以下代码。

#include <stdio.h>

int main()
{
  int *ptr;
  printf("%d\n",*ptr);
  return 0;
}

我很惊讶地看到了结果 在Linux上直接安装在桌面上它给出了“分段错误” 而在安装在虚拟机上的linux上,它会输出一些垃圾值。 任何人都可以帮我解释为什么会这样?

3 个答案:

答案 0 :(得分:1)

您的指针未初始化。初始化如下:

int a = 42;
int *ptr = &a;

取消引用非初始化指针会调用未定义的行为,您的printf调用可能会打印一些垃圾或者只是崩溃。

我建议你读一本关于C编程的书吗?

答案 1 :(得分:1)

因为你正在处理“未定义的行为”。究竟发生了什么没有定义。它可能会崩溃,可能会燃烧,或者可能会发生其他预期或意外的事情。

在这种特殊情况下,可能是ptr来自堆栈的值 - 它将在虚拟机上有一个有效的内存地址,所以你得到一些随机的内存位不知道它是什么。在非虚拟机上,值不同[或内存的位置不同],并且您获得了访问无效内存位置的seg-fault。

通过访问尚未设置为任何内容的指针可以获得任何有用的东西,但它远远不能保证崩溃。它也可以打印那个内存地址。

答案 2 :(得分:1)

你有未初始化的指针。指针就像整数一样,地址指向哪个点。由于未初始化,它可能包含任何值。因此,在您的VPS上,它可能指向您的进程可以访问的某个有效地址,并且在您的计算机上它指向该进程无法访问的未知内容。