-1

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

#include <stdio.h>

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

我很惊讶地看到直接安装在桌面上的 linux 上的结果会给出“分段错误”,而在虚拟机上安装的 linux 上它会打印一些垃圾值。谁能帮我理解为什么会这样?

4

3 回答 3

1

您的指针未初始化。像下面这样初始化它:

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

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

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

于 2013-02-12T13:02:28.790 回答
1

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

在这种特殊情况下,它可能与ptr从堆栈中获得的值有关——它将在虚拟机上具有有效的内存地址,因此您会获得一些您不知道它是什么的随机内存位。在非虚拟机上,该值不同[或内存位置不同],并且您会因访问无效内存位置而出现段错误。

访问一个没有被设置为任何东西的指针并没有什么用处,但它远不能保证崩溃。它也可以打印该内存地址处的任何内容。

于 2013-02-12T13:05:21.193 回答
1

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

于 2013-02-12T13:07:04.870 回答