• ベストアンサー

printfでSegmentation fault

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

  • cias
  • お礼率36% (12/33)

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

  • ベストアンサー
回答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

  • Segmentation fault

    最短経路問題を解くプログラムを作って完成したのですが、でる時は連続して出てしまうのですが Segmentation fault (core dumped) と表示されてしまいプログラムが実行中なのに途中で終わってしまいます.ほんとうならネットワークの直径が表示されるんですが。。 gcc daijkstra.c ./a アクセスポイント>>> 90 全ネットワーク数>>> 50 Segmentation fault (core dumped) (表示された場合.) gcc daijkstra.c ./a アクセスポイント>>> 90 全ネットワーク数>>> 50 直径>>>>4.432 (成功した場合.)

  • fscanf Segmentation fault

    すいません。Segmentation faultがでてプログラムが動きません・・・原因がわからないのでわかる方がおられましたら教えてください。 FILE* Bank::setFp( const char c[]){ if(fp!=NULL){ fclose(fp); }else{ fp = fopen("c[]","r"); } return fp; } Bank::Bank(char c[]){ fp = 0; size = 0; arraySize = 0; int some = 0 ; int bal; char ac[16]; char cust[316]; fp = setFp(c); fscanf(fp, "%d:",&some); grow(arraySize+10); for(int i=1 ; i<arraySize ; i++){ fscanf(fp, "%[^,],%d,[^;];",arraySize,ac,&bal,cust); savings[i].init(cust,ac,bal); size++; fclose(fp); } } ちなみにSegmentation fault は fscanf(fp, "%d:",&some);を作動した時にでました。 ちなみにサンプルデータは、 3:423423454567987,9234617,Woo,Charles,Winnipeg,416-555-5558;523423454567987,2534,DeJesus,Pancho,Edmonton,416-555-5559;623423454567987,543876,Smith,Bob,Charlottetown,416-555-5544; です。 メインプログラムでは、Bank one("a34.dat");と読んでるだけです。 よろしくお願いします

  • 別のPCにファイルを移してコンパイルして実行するとsegmentation faultになる。

    外のPCで正常に動いているプログラムを自分のノートPCでも動かそうと思いソースファイル等必要なものをディレクトリごと移しました。コンパイルはできましたが実行するとプログラムの開始の段階でsegmentation faultになってしまいます。他のPCでは正常に動いているコードなので間違いはないはずです。 cygwin環境です。 これはどういった原因で起こると考えられるでしょうか?

  • Segmentation fault その2

    ダイクストラ法を用いて最短経路を表示するプログラムなんですが void daijkstra(int a) { //count[] この関数では定義していません(この外です) int g, b, c, d, e, f; //アクセス出来る点を探索. for(b = 0, c = 0;b != ten;b++){ if(adj[a][b] == INT_MAX || a == b) continue; else{ if(no_loop[b] != ten * hen){ count[c] = b;//アクセス出来た点を入力. c++; no_loop[b] = no_loop[b] + 1; } } } count[c] = -1; for(d = 0;count[d] != -1; d++){ c = count[d]; if(place[c] == INT_MAX){ place[c] = adj[a][c] + place[a]; } else{ g = adj[a][c] + place[a]; if(g < place[c]){ place[c] = g; } } } for(e = 0;count[e] != -1;e++){ f = count[e]; daijkstra(f); } return; } こういった感じに完成しました。 ですがSegmentation fault (core dumped)と表示されどうしても出来ない場合が時々あるんです.(main 関数でネットワークをランダムに生成しています。上記の関数だけでは情報が少ない場合はmainを載せます。) スタックオーバーフロウが起きているのは確実なんですがそれを回避する術を知らないのでどうかご協力をお願いします. ten * hen を1に変更すると2回目にアクセスした場合に2回目の方が短い場合更新できなくなるので1以上にして、ten * henは全ての点に全部の辺が付いていると考えた『これ以上はないはず』といういみがあります

  • printf()関数の括弧を二重にして、printf((~~~))とし

    printf()関数の括弧を二重にして、printf((~~~))として コンパイル/実行すると、実行時セグメンテーション違反が発生します。 コンパイル時には警告も発生しますが、このセグメンテーション違反が なぜ起こるのか理由がよくわかりません。ご回答いただけるとありがたいです。 以下、サンプルコードと実行例です。よろしくお願いいたします。 ---mytest.c---- 1 #include <stdio.h> 2 3 int main(void){ 4 5 //printf("test:%d", 1)ではもちろんコンパイル/実行に成功する。 6 printf(("test:%d", 1)); 7 return 0; 8 } 【コンパイル/実行結果/gccバージョン】 #gcc main.c main.c:6:警告:passing argument 1 of printf makes pointer from integer without a cast #./a.out セグメンテーション違反です # gcc --version gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27) ・ ・

  • free()関数の多用 と Segmentation fault

    これはプログラム中のループ内です ===================== m = IntArray(SIZE); //関数内でmallocを使用 … puts("a");   //最後に'a'が表示されて終了 free(m); puts("b"); ===================== プログラムを実行するとループ内でfree()関数を何度も通るのですが 途中でSegmentation faultが起きて停まります。 free()関数を取り除いても強制終了されます。 この現象の対処法をどなたか教えていただけないでしょうか? よろしくお願いします。

  • C言語 Segmentation fault

    program SPROGRAM 17 4 pas104 SIDENTIFIER 43 4 ( SLPAREN 33 4 上記のようなファイルを読みこんで、1行づつ各トークン(programとか17とか)を構造体に格納する関数reader()を作りましたが、これを以下のparser.cで呼びだすと「Segmentation fault(core dumped)」となってしまいます。gdbのrunコマンドでプログラムを実行すると、関数を呼び出す所で Program received signal SIGSEGV, Segmentation fault. 0x0040140f in reader () と表示されました。が,どうすればよいか全然分かりません・・・ どうすれば正しく動作してくれるのか、どなたか教えてください・・・ 以下ソース /*read.c*/ #include "head.h" void reader(void) { fprintf(stdout,"check"); char buf[BUF_LEN]; if (fgets(buf,sizeof(buf),fp) == NULL)/*ここで1行読みこむ*/ {/*いきなりNULLの場合*/ strcpy(t.str, ""); t.num = SEOF; t.line = 1; } else { 省略 } return; } /*parser.c*/ #include "head.h" struct tokenbox t; FILE *fp; int main(int argc, char *argv[]) { if (argc != 2)/*引数チェック*/ { fprintf(stderr,"Usage: (./parser) (file.ts)\n"); return -1; } int len; len = strlen(argv[1]);/*file.ts の長さ取得*/ if((argv[1][len-1] == 's') && (argv[1][len-2] =='t') && (argv[1][len-3] == '.'))/*tsファイルが指定されているかどうか*/ { fp = fopen(argv[1],"r");/*ファイルオープン*/ if (fp == NULL) { fprintf(stderr,"Such ts file is not exist\n"); return -1; } fprintf(stdout,"authenticate ts file!\n");//←これは出力される reader(); //←ここでSegmentation faultと思われる printf("t.str = %s\n", t.str); printf("t.str[0] = %c\n", t.str[0]); printf("t.num = %d\n", t.num); printf("t.line = %d\n", t.line); fclose(fp); return 0; } else { fprintf(stderr,"the file is not ts\n"); return -1; } } ヘッダファイル一部抜粋 /*head.h*/ #include <stdio.h> #include <string.h> #include <stdbool.h> #define BUF_LEN 128 #define TOKEN_LEN 128 struct tokenbox {/*tsファイルの各情報を格納する構造体*/ char str[TOKEN_LEN]; int num; int line; }; extern struct tokenbox t;/*構造体をtと置く*/ extern FILE *fp; /*ファイルポインタ*/

  • printf()で出力したいんですが?

    #include <stdio.h> int main( void ) { int air[4]; int i; i = 0; printf( "データ入力\n" ); do{ scanf( "%d\t", &air[ i++ ]); } while(air[ i - 1 ] > 0 ); printf( "%d\n", i ); return 0; } このプログラムはコンパイル出来ますが、期待していたprintf関数での出力ができません。 その理由として何がありますか?関数の使い方が間違っているのか、DO~WHILE文が使えない場所 なのか、もし直すとすればどう直せばいいのですか。

  • <conio.h>getche() → <curse.h>getc() = segmentation fault

    WindowsのVC++からUNIXのgccに移行している最中です。 VC++では下記のようにgetche()を使っていたんですが printf("Enter more data (Y/N) => "); ch = toupper(getche()); index++; if(ch != 'Y') repeat = FALSE; UNIXではconio.hとgetche()がないとのことで cursh.hとgetc()を使うことにしました。 printf("Enter more data (Y/N) => "); ch = toupper(getc(stdin)); putchar(ch); index++; if(ch != 'Y') repeat = FALSE; } if((file_ptr = fopen("C:FLIGHTS.DTA","w")) == NULL) { printf("Can't open filights file."); exit(0); } fwrite(flights_array, sizeof(flights_array), index, file_ptr); fclose(file_ptr); 最初の入力は良いのですが'y'と打ってからの入力が 一つ飛ばされてしまいます。 (まるでscanfでfflush(stdin)を付け忘れたかのように) Flight ID => NW123 Preminum Capacity => 12 Available Preminum Seats => 12 Economy Capacity => 120 Available Economy Seats => 120 Enter more data (Y/N) => y Y Flight ID => Preminum Capacity => 6 //←Flight IDの入力が飛ばされてます… Available Preminum Seats => 6 Economy Capacity => 45 Available Economy Seats => 45 Enter more data (Y/N) => n Segmentation fault そして挙句の果てにSegmentation faultが出て止まってしまいます。 VC++ → gccの移行は初めてなのでどうしていいのか分かりません。 どなたか良い解決方法をご存知の方、助けてください。お願いします。

  • ご教授ください。Segmentation faultが突然出ました!

    卒論でプログラム作成しているのですが、Segmentation faultがでて困っています。 おそらく以下の個所があやしいと思うのですが、どこが危険か教えていただけるでしょうか?大きいプログラムなため以下にあやしい個所を一部抜粋します。 関数Bが特にあやしいと思っていますが、どう直していいのかわかりません;; /* main一部 */ struct buf{ int id; int no; int wnd; struct buf *next; }; struct buf temp; struct buf *restart1=&temp; struct buf *resenddata1; struct buf *rere; /* 関数Aの一部 */ flowdata = (struct buf *)malloc(sizeof(struct buf)); resenddata1->next=flowdata; flowdata->next=NULL; resenddata1=flowdata; temp_num[n]++; resenddata1->no=temp_num[n]; resenddata1->wnd=cwnd[n]; /* 関数Bの一部 */ if(restart1->next != NULL){ rere = restart1->next; restart1->next = rere->next; if(check_no[n] == rere->wnd){ t_dep[n]=t+ceil(rto[n])*2-d12*2; if(rere->no > max_no[n]){ max_no[n] = rere->no; } } free(rere); } 簡単に説明しますと、restartというスタート地点にどんどんresenddataをつなげていっています。(最後にNULL)ある地点にいくとrestart->nextをrereに入れてrereを解放という形です。ちなみにrestart1,restart2と同じようなものがあり、関数Aとrereは同じものを使うようにしています。(resenddata2として.rereは共通) お手数ですが、よろしくお願いします。