64ビットマシンでこの問題に遭遇した場合は、元のコードを模倣する必要がありますが、スタックを64ビットマシンにラップする番号を指定する必要があります。提供元の数は以下のとおりであった:
$ bc
z=1073741796
z+28
1073741824
(z+28)*4
4294967296
2^32
4294967296
quit
$
そこで、入力された番号を記述する一つの方法は、(ULONG_MAX - 112)である/ 4
64ビットマシンのアナログ番号であります4611686018427387876:
$ bc
x=2^64
x
18446744073709551616
y=x/4
y
4611686018427387904
y-28
4611686018427387876
quit
$
しかし、この作業のチャンスを立って、あなたがstrtroull()
または類似のものを使用することが報告コードを変更する必要があると思います。 atoi()
は通常32ビットの整数に制限されており、上記の64ビットの数字には使用できません。コードも含まれています
num_as = atoi(argv[1]);
if (num_as < 5) {
errx(1, "Need 5.");
}
p = malloc(num_as);
どこnum_as
がsize_t
とp
がchar *
です。だから、malloc()
は膨大なスペース(ほぼ4 EiB)にできる必要があります。ほとんどの人は、バッキングのためのディスク容量があっても、マシン上に十分な仮想メモリを持っていません。さて、たぶん多分、おそらく、Linuxはあなたが過度にコミットする(そしてOOM Killerを後で起動させる)が、malloc()
は失敗する可能性が高いでしょう。
64ビットシステム(まだ)に影響を与えない方法で、32ビットシステムに関連して影響を与える他の機能がありました。
64ビットマシンでそれを再現するには、おそらく32ビットのコンパイルが必要です。その後、風があなたの後ろにあり、関連するソフトウェアの適切な古いバージョンがあれば、おそらくそれを再現することができます。
Ubuntu 9.04を実行していますか? –
いいえ、それはbarebones linux 2.6.29.1ボックスでビジーボックスです。 – woodstok