- ベストアンサー
Cモジュールの落ちる現象について
- Cモジュールのモジュール作成中にたまに落ちるという問題が発生しています。
- 現在作成中のCモジュールで、特定の関数の箇所で時々落ちることがわかりました。
- 詳細な要因はわかっていませんが、関数のどこで問題が起きているかを特定することができていません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>i=0; >ckdt[i] = strtok(ln," \n\0"); >while(ckdt[i] != NULL || i < 6){ >i++ ; >ckdt[i] = strtok(NULL," \n\0"); >} while文のループで、iが5のとき、i < 6 の条件を満たすので、 ループからは抜けずに i++; を実行しますから、iは6になりますよね。その状態で ckdt[i] = strtok(NULL," \n\0"); を実行すると、ckdt[6]に書き込もうとしますので、 >char *ckdt[6] ; オーバーフローしないでしょうか。 さっきの回答と同じで、取り越し苦労ならばいいのですけれど。
その他の回答 (4)
- asuncion
- ベストアンサー率33% (2127/6289)
>objを初期化する際には >memcpy(obj,0,sizeof(obj)); >では、不足しているということでしょうか? 他の回答者さんからの回答にありましたとおり、 その引数の並びを使うのであれば memcpy()ではなくmemset()でしょうね。 memcpy()の第二引数はコピー元の領域を指すポインターです。 0としたときに、NULLか何かに勝手に置き換えてくれる、という保証があるのかどうか、 私にはわかりません。 まあ、sprintf()の準備として初期化している、ということであれば、 その初期化自体が不要である、と思います。
お礼
ご回答ありがとうございます。 なんども同じ変数を使いまわしているのですが、 sprintfだけでは完全に初期化できなかったことがあったのでmemcpyを使用しました。 (本当はmemsetが正しいみたいですが、、、) とりあえず、想定どおりに動いていますので、memcpyのまま使います。
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
>異なる引数で同時に複数回実行されます。 「スレッドセーフではない」って事かな? IOストリーム関数がスレッドセーフかどうかは、処理系によって異なるので「異なる引数で同時に複数回実行」するのであれば、使用している関数がすべてスレッドセーフなのかどうか確認する必要があります。
お礼
ご回答ありがとうございます。 別プロセスとして起動するという意味で記載しておりました。 ですので、特に影響はないと思っているのですが、 私の勘違いの可能性もあり、記載させていただきました。
- wormhole
- ベストアンサー率28% (1626/5665)
>また、本関数を実行するCモジュールは、異なる引数で同時に複数回実行されます。 「同時に」というのはスレッドで実行されることがある。ということでしょうか。 >memcpy(obj,0,sizeof(obj)); memcpy()ではなくて、memset()ではないですか。 memcpy()とmemset()の違いは調べてみてください。 それも、その後にstrcpy()やsprintf()の出力先に使うのなら特に必要もないですけど。
お礼
ご回答ありがとうございます。 >「同時に」というのはスレッドで実行されることがある。ということでしょうか。 別プロセスにて起動するという意味で記載しておりました。 >memcpy()ではなくて、memset()ではないですか。 たしかに、memsetですね。。。 なぜかmemcpyと勘違いしておりました。。。
- asuncion
- ベストアンサー率33% (2127/6289)
>char cktm[5],ckwk[4],line[256],ln[256],mes[512],obj[256] ; >memcpy(obj,0,sizeof(obj)); >strcpy(obj,Object); ここで、obj[]がたぶん満杯となっている状態のとき、 >strcat(obj," "); strcatして大丈夫なんでしょうか。 obj[]のサイズを多めにしておく必要は、ないでしょうか。 取り越し苦労かもしれませんけれど。
お礼
asuncionさん ご回答ありがとうございます。 Objectには現状最大でも英数字で30文字までしかはいらないので、 objが満杯になることはないと思っています。 今、asuncionさんのご指摘をみて、思ったのですが、 objを初期化する際には memcpy(obj,0,sizeof(obj)); では、不足しているということでしょうか? 下記のリンク先より、上記のコマンドを選択したのですが・・・ http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1219043042
お礼
何度もご回答いただきありがとうございます。 確かにオーバーフローしますね。 どうにもご指摘箇所が原因のような気がします。 ありがとうございます!