x86_64アーキテクチャのLinux 3.0でのプロセスには、64ビットの仮想アドレス空間があります。x86_64 Linux 3.0:無効なメモリアドレス
0
は、NULL
ポインタを示すために、このアドレス空間で無効なメモリアドレス[以下の定義を参照]であることが保証されています。
その他の64ビット番号(存在する場合)は、決して有効なメモリアドレスではないことが保証されていますが、その理由は何ですか?
たとえば、1
は有効な住所ですか? 2^64-1
はどうですか?
: "は無効なメモリアドレスであることが保証されていますか?"とはどういう意味ですか?この質問の目的のために
void deref_and_assign(uint64_t i)
{
char* p = (char*) i;
*p = 42;
}
保証無効なメモリ参照が機能deref_and_assign
は常にSIGSEGV
を上げることを意味します。
、なぜためSIGSEGV
同様に得られることを前提とすることができますあなたが探している情報ですか?おそらくコードに基づいて書くべき情報ではありません。研究のために、もちろん、何でも行く。;) –
好奇心は良いです。私は移植性のない動的なタイプ(Linux/x86_64ターゲット用)を実装していますが、リード64ビット値「コードユニット」のオーバーロードについては私の選択肢を考慮しています。これを行う1つの方法は、コードユニットを(a)即値と(b)ポインタをより多くの情報に分割することです。簡単な例として、次のように動的な数値/文字列型を表すことができます。(0-4095)これは、整数0,1,2 ... 4095として直ちに表される数値です。 (4096-2^64)これはヌルで終了する文字列へのポインタです。実際の世界の例では、RubyのVALUE型がどのように動作するかを見てみましょう。 ruby.t.gz ruby.tgz –