-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 に答える