• ベストアンサー

printfでSegmentation fault

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

「かなり省略」の部分が重要だと思います。 スタックフレームを破壊している可能性があります。 main, a, bのいずれかの関数でローカルな配列を使っているなら、ためしに配列のサイズを必要量の何倍かに拡大してみてください。これによって症状がなくなるか緩和されるのであれば、配列の上限を超えて書き換えているということになります。 場合によってはprintfの後で落ちているという可能性もあります。なぜなら、printfは、改行が与えられない限り短い文字列はバッファに溜まるだけで、直後でSEGVした場合は画面に反映されないためです。 コメントアウトしたら大丈夫だからprintfのせいだとは限りません。その有無によってスタックフレームの構成が最適化されて、たまたま落ちないだけかもしれません。

cias
質問者

補足

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

その他の回答 (4)

回答No.4

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

cias
質問者

補足

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になります。全部インクルードファイルはちゃんとやっています。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.3

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

cias
質問者

補足

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

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.2

そのソースファイルの中で #include <stdio.h> はちゃんとしてますよね?

cias
質問者

補足

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

  • asaichi
  • ベストアンサー率21% (37/171)
回答No.1

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

cias
質問者

補足

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

関連するQ&A

専門家に質問してみよう