実は奥が深かったポインタ解説記事 [ざれごと]
すっかり有名になった、 某所の ポインタの解説記事ですが、実は、奥が深かったことが判明しました。
信じられない間違い
今回のポインタ解説記事は、にわかには信じられない間違いが記述されていました。
#include <stdio.h> int main( void ) { int *n; *n = 5; printf( "%d\n", *n ); return 0; }
普通では考えられない間違いなので、きっと、何か秘密が隠されているに違いないと私は調査を開始しました。
特定の処理系に依存するのか?
このプログラムは、明らかに問題があるのですが、もしかしたら、ある特定の処理系で意味を持つものかも知れません。 そこで、自宅で稼動しているあらゆる処理系に片っ端から試してみました。
- FM-77 Doraco C
- OKI if-800 BDS-C
- Apple ][ UCSD p-system C
- SONY Hitbit MSX-C
ついに発見、イースターエッグ
そして、ついに発見しました。 PDP-11のBSD-C4.1でコンパイル、実行したところ、プログラムが、何か意味のある数値を表示したのです。
# a.out 131080 #
どうやら、このプログラムをコンパイルしたときに限り、発動するイースターエッグのようです。 しかも、特権ユーザにならなくては、動作しないという念の入れようでした。
ところが、記事のプログラムには肝心なところに間違いがありました。 *nを十進数値として表示させてはいけなかったのです。 正しくは、
printf( "%s\n", *n );
と、文字列として表示させるべきでした。 すると、良く見られる言葉が表示されるようになりました。
# a.out Happy April Fool !!! #
お疲れさまです。
当家で稼働している、PC9801用PowerCもお貸ししましょうか。
by DAI (2008-04-01 21:17)
最初の方はまじめに読み始めて、途中で???、最後であははでした。
関連サイトの方も、笑えますね。
それにしても、元の記事ってネタだったんでしょうか。
by Sim (2008-04-02 00:24)
面白いです。コメントも面白いです。
嗚呼、私も何かギャグ考えておけば良かった。
by hamayan (2008-04-02 07:43)
皆様、楽しんでいただけましたでしょうか。
夜9時まえに風呂で思いついたネタで、時間に追われて急いで書きました。
昔の処理系を思い出すのが大変で、「UCSD-PにCコンパイラってあったっけ?」などと時代考証は適当です。
今度は、PowerCも貸していただきます。
by noritan (2008-04-02 20:13)
noritan さん、処理系の列挙のあたりで気がつきました。
しかし、このネタから来るとは思いませんでした。
以前はトラ技の4月号で1ページを使って4月1日ネタをやってましたよね。
来年に向けて1年がかりでネタ探ししましょう。
by DAI (2008-04-02 23:15)