プロが教える店舗&オフィスのセキュリティ対策術

gccでプログラムを作っています。
分割コンパイルを試していたのですが、
printf("a");
なら正常なのに、
i=1;
printf("%d",i);
とするとSegmentation faultになります。
printf("%f",0.1);
とかも無理です。
分かる方がいらっしゃいましたらお願いします。

A 回答 (5件)

「かなり省略」の部分が重要だと思います。



スタックフレームを破壊している可能性があります。

main, a, bのいずれかの関数でローカルな配列を使っているなら、ためしに配列のサイズを必要量の何倍かに拡大してみてください。これによって症状がなくなるか緩和されるのであれば、配列の上限を超えて書き換えているということになります。

場合によってはprintfの後で落ちているという可能性もあります。なぜなら、printfは、改行が与えられない限り短い文字列はバッファに溜まるだけで、直後でSEGVした場合は画面に反映されないためです。

コメントアウトしたら大丈夫だからprintfのせいだとは限りません。その有無によってスタックフレームの構成が最適化されて、たまたま落ちないだけかもしれません。

この回答への補足

ビンゴです。
スタックですね…
ありがとうございました。

補足日時:2003/05/08 17:08
    • good
    • 1

main() {


int i = 1;
printf("%d", i);
}
でさえだめということでしょうか?
改行を入れたら(つまり"%d\n")、症状は変わりますか?
分割コンパイルというのは、何をされているのでしょうか?printfは正常で他で落ちているという可能性はありませんか?

この回答への補足

main関数があるファイルではOKです。
現在の状況は、
main.c--------------
main(){
a();
}
a.c------------------
void a(){
b();
}
b.c-------------------
void b(){
int i=1;
printf("%d",i);
}
ってな感じです(かなり省略)。ファイル3つでb.c以外ではprintfは正常です。
ところが、b.cでのprintfはSegmentation faultになります。全部インクルードファイルはちゃんとやっています。

補足日時:2003/05/08 14:09
    • good
    • 0

Segmentation fault が printf で発生していると考える根拠は何でしょう。


プログラムの変更箇所がそこだけであっても、それが他の箇所に影響している
ことはよくあります。
printf で間違いないということなら、ライブラリのバグとしか思えませんが。

この回答への補足

私もその他かと思うんですが、printfをコメントアウトすると正常に動くんですよね。
ただ、そのときの変数の値とか知りたくて…

補足日時:2003/05/08 14:03
    • good
    • 0

そのソースファイルの中で



#include <stdio.h>

はちゃんとしてますよね?

この回答への補足

ちゃんとやってますね。
なければ
printf("a");
も駄目な気が…
回答ありがとうございます。

補足日時:2003/05/08 13:49
    • good
    • 0

変数「i」は、何型ですか?多分intかshortかlong型


(多分intかな?)と思います。
このソースの全体が見えていないので、特定はできませんが、このprintf関数にくるまでに、変数iのポイ
ンタを破壊している可能性があります。変数iを宣言
したところでその前の行で宣言した変数をポインタで
処理していませんか?
int j; ←この変数を間違った操作?
int i; ←今回の症状
/* 極端なサンプルです */
memcpy( &j , "ABCDE" , 5 );
てな感じです。
あくまでも一例なので、原因は他にも考えられます。
該当する行までの処理で、ポインタもしくは配列操作
で破壊していなかのチェックをお勧めします。

この回答への補足

int i=1;
printf("%d",i);
もだめです。
だからそこまでで破壊してることはないかと…
回答ありがとうございます。

補足日時:2003/05/08 13:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!