8

Arthur Whitney の素晴らしい作品を見つけました - http://www.jsoftware.com/jwiki/Essays/Incunabulum

いくつかの警告でコンパイルされました

$ gcc-4.7 incuna.c -o incuna.o
incuna.c: In function 'ma':
incuna.c:8:15: warning: incompatible implicit declaration of built-in function 'malloc' [enabled by default]
incuna.c: In function 'pi':
incuna.c:26:7: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
incuna.c: In function 'nl':
incuna.c:26:24: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
incuna.c: In function 'pr':
incuna.c:28:10: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
incuna.c: In function 'ex':
incuna.c:35:36: warning: assignment makes integer from pointer without a cast [enabled by default]
incuna.c:35:25: warning: return makes pointer from integer without a cast [enabled by default]
incuna.c: In function 'noun':
incuna.c:37:57: warning: return makes integer from pointer without a cast [enabled by default]
incuna.c: In function 'wd':
incuna.c:39:21: warning: incompatible implicit declaration of built-in function 'strlen' [enabled by default]

しかし、基本的な入力を入力するとセグメンテーション違反が発生しました1 + 1

./incuna.o
warning: this program uses gets(), which is unsafe.
1 + 1
[1]    11525 segmentation fault  ./incuna.o

これは、1989 年以降の C コンパイラの違いと関係があると思います。

どうすればこれを実行できますか?これを最近の Linux/Mac で動作させることはできますか? またはVirtualBox VM上で?それとも何か?

私のGoogle検索では、関連するものは何も見つかりませんでした。

4

4 に答える 4

9

ポインターを相互に変換しintますlong。これは、サイズが異なる 64 ビット アーキテクチャではうまくいきません。

32 ビット ターゲット用にコンパイルします。たとえば、Mac OS X で clang/LLVM を使用する「-arch i386」を使用します。

于 2012-12-11T19:40:04.553 に答える
4

プリプロセッサのみで実行します。

gcc -E interp.c > interp-pp.c

次に、エディタで整形し、デバッガを使用して動作を確認します。

于 2012-12-11T20:19:08.163 に答える
4

これが原因でセグメンテーション違反が発生したと推測します。

incuna.c:8:15: 警告: 組み込み関数 'malloc' の互換性のない暗黙の宣言 [デフォルトで有効]

malloc が宣言されていない場合、メモリが割り当てられず、null を逆参照することになり、セグ フォールトが発生する可能性があります。

含めた後:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

printf()malloc()、およびの警告strlen()はなくなりました。次のように入力すると、コードが実行され、機能します。

1+1

ここでは間隔が重要であることに注意してください。

1 + 1 

セグメンテーションします。

于 2012-12-11T19:33:07.697 に答える