我试图在桌面上安装的Linux上以及安装在虚拟机中的相同Linux上执行以下代码。
#include <stdio.h>
int main()
{
int *ptr;
printf("%d\n",*ptr);
return 0;
}
我很惊讶地看到了结果 在Linux上直接安装在桌面上它给出了“分段错误” 而在安装在虚拟机上的linux上,它会输出一些垃圾值。 任何人都可以帮我解释为什么会这样?
答案 0 :(得分:1)
您的指针未初始化。初始化如下:
int a = 42;
int *ptr = &a;
取消引用非初始化指针会调用未定义的行为,您的printf
调用可能会打印一些垃圾或者只是崩溃。
我建议你读一本关于C编程的书吗?
答案 1 :(得分:1)
因为你正在处理“未定义的行为”。究竟发生了什么没有定义。它可能会崩溃,可能会燃烧,或者可能会发生其他预期或意外的事情。
在这种特殊情况下,可能是ptr
来自堆栈的值 - 它将在虚拟机上有一个有效的内存地址,所以你得到一些随机的内存位不知道它是什么。在非虚拟机上,值不同[或内存的位置不同],并且您获得了访问无效内存位置的seg-fault。
通过访问尚未设置为任何内容的指针可以获得任何有用的东西,但它远远不能保证崩溃。它也可以打印那个内存地址。
答案 2 :(得分:1)
你有未初始化的指针。指针就像整数一样,地址指向哪个点。由于未初始化,它可能包含任何值。因此,在您的VPS上,它可能指向您的进程可以访问的某个有效地址,并且在您的计算机上它指向该进程无法访问的未知内容。