2010年11月18日木曜日

たまにはC言語の話

昨日の夕方、ケータイが鳴って知人からヘルプの電話。
「C言語の質問なんだけど・・・」

C言語・・・もう何年触ってない?10年前、新社会人として会社に入って新人研修で初めてプログラムの世界に触れ、その一番最初がC言語だった。その後仕事で丸2年ぐらいやったのかな?それ以降はJavaとかPerlとかWEB周りの言語にシフトしたから、C言語のことを考えるのなんて・・・8年ぶり?

そんなことを知ってか知らずか、とにかく現場で一刻も早くプログラムを何とかして動かさないといけないがC言語は専門外の彼は、それでも的確に状況を説明してくれる。やはり文字列(ポインタ)周りで泥沼に足を突っ込んだようだ。

話を聞き、とりあえず気になった点を指摘したところ無事解決し、事なきを得た。三つ子の魂百まで、とは言うが、結構覚えているもんだ。


というわけで「C言語、最近触ってないなぁ」という方は、頭の体操替わりに一緒に「何が原因だったか」を考えてみませんか?


さぁ、電話がかかってきました・・・

電話の向こうで困っている同僚からのヘルプ



あ、すいません、教えてください。やりたいことは以下なんです。
  1. メインの関数から、とある関数func()を呼び出しているんですが、

  2. 呼び出し元のメイン関数側で文字列変数を「char* aaa」と用意して、

  3. それをfunc()の引数に渡してます。つまり呼び出し先のfunc()は引数として、 char* aaaをもっています。

  4. このfunc()のアウトプットとしては、その「引数の文字列aaaに、新しく値をセット」することです。

  5. func()の処理終了後、呼び出し元のメイン関数側では、引数aaaにセットされた値を利用して処理を継続します。


と、こういうのを想定しているんですが、なぜか処理がABENDするんです。
文字列のポインタはちゃんと渡せてると思うんですけど・・・

いったい、何がダメなんですか?
(写真はイメージです)


さぁ、このヘルプを受け取ったアナタ、以上の情報からズバっと原因を指摘してあげてください。






答え合わせ


原因はね、func()に渡す引数のメモリ領域を確保(malloc)していないからだよ。




いかがでしたでしょうか?
まぁ、C言語知ってる方ならいちいちこんなストーリー仕立てにした割にそれだけかよ!っていう感じですね、すいません。

でもポインタの操作って慣れるとすっごく便利ですけど、こういうのがあると厄介ですよね。やっぱりその辺、Javaはうまくラッピングしてあるなぁと思います。それも良し悪しですが…。

0 件のコメント: