• 締切済み

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

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

みんなの回答

  • kochory
  • ベストアンサー率45% (167/370)
回答No.2

#1です。 どうやら、cygwinではulimitでスタックサイズの変更はできないようですね。 アプリケーションごとにスタックサイズを指定するようです。 プログラムをコンパイルするときに、 gcc --stack **** (プログラム名) としてみてください。 ****に適当な数字を入れてください。 ulimitで見る限りスタックサイズは2043(KB)のようなので、 それより大きい値を指定してみてください。 (あと、一応、私の推測とは異なる原因でエラーが出ているかもしれないので、 そのプログラムは配列のサイズを十分小さくしたら正常に動くかどうか 確認してみてください。)

mago83
質問者

補足

小さい入力ファイルでは問題なく実行できるようなのでやはりメモリの問題のようです。 >gcc --stack **** (プログラム名) とすると、 unrecognized option '-stack' と出てしまいます。

  • kochory
  • ベストアンサー率45% (167/370)
回答No.1

おそらく、配列のサイズが大きすぎるのでしょう。 通常は、ユーザーごとに使用できるスタックサイズの上限が 決められていて、それを超えるサイズの配列を使うと Segmentation faultになります。 「外のPC」ではその制限がはずされていたのでしょう。 自分のPCで制限をはずすには、シェルのプロンプトから ulimit -s unlimited と打ち込んでください。 これで使用可能なスタックサイズが無制限になります。

mago83
質問者

補足

ありがとうございます。 >ulimit -s unlimited というコマンドを打ち込みましたが、 「bash: ulimit: stack size: cannot modify limit: Invalid argument」 と出てどうもだめなようです。

関連するQ&A

  • printfでSegmentation fault

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

  • fortranでsegmentation faultが出る

    初めまして。fortran77のとあるプログラム群を扱っているのですが、配列の添字を決めているparameterの数を大きくするとsegmentation faultが出てしまいます。 integer ABC parameter (ABC = 200000) !この値を大きくすると出ます。 hairetsu(ABC) こんな感じです。 プログラムはcygwinで走らせてます。 どなたか解決方法を教えていただけないでしょうか?

  • Segmentation fault

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

  • Segmentation fault

    Cygwinにてアルゴリズムの勉強のためにC言語で コーディングしているのですが、Segmentation fault (core dumped) という言葉が出てファイルを実行できません。 試行錯誤しているのですが手に負えません。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define MAX_LINE 30 int main(void); int main(void){ char buffer[3]; int taro,hanako,number; int judge[4][4] = {{3,1,2,2,},            {2,3,1,2,},             {1,2,3,2,},             {1,1,1,3,},                 }; char kekka[3][MAX_LINE] = {"太郎の勝ち", "花子の勝ち", "あいこ" }; gets(buffer); taro = atoi(buffer); taro = taro-1; gets(buffer); hanako = atoi(buffer); hanako = hanako-1; number = judge[taro][hanako]; printf("じゃんけんの結果は%sです。",kekka[number][MAX_LINE]); return(0); }

  • GNUコンパイラとIntelコンパイラの違いについて

    今回fortranとC言語で書かれたWindows用プログラムをLinux用に移植することになりました。GNUのコンパイラを使用し無事コンパイルできたので実行したのですが"Segmentation fault"となりうまく実行できませんでした。そこで試しにIntelのコンパイラを使用しコンパイルしてみたところGNUのときとは違い"Segmentation fault"とは出ず、プログラム内のエラーチェックに引っかかり止ってしまいました。同じソースコードにもかかわらず止まる箇所が異なります。 今まで考えたことがなかったのですがGNUとIntelのコンパイラの違いはなんなのでしょうか?また、この二つ以外にいいコンパイラはあるのでしょうか?

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

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

  • 実行ファイルが作成環境以外のPCで実行が出来ません。

    実行ファイルが作成環境以外のPCで実行が出来ません。 現在Windowsプログラミングでアプリケーションを作成しております。 しかし作成した実行ファイルを他のPCで実行しようとすると [cygwin1.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールしなおすとこの問題は解決される場合があります。] とのエラーメッセージが表示され、実行することができません。 恐らくCygwin関係のエラーだとは思うのですが、Cygwinが入っていない環境でも使用できるようにすることは出来ませんでしょうか? 必要そうな情報を下に書いておきます 作成環境:Vista Cygwin コンパイル:gcc -mwindows a.cpp a.o 実行環境:X Cygwin無し

  • C++のソースをコンパイルしてできた実行ファイル

    のトラブルです。ちなみにプログラミングはかなりの初心者です。 サンプルソース等をコンパイルして実行ファイルを作成しても、実行ウィンドウが固まってしまいます。 どのプログラムでコンパイルしても同じです。二台のPCのVisual C++でやってみましたが(VistaデスクトップとXPノート)、どちらでもビルドが正常終了した後実行ファイルを確認するとファイル名の表示されたウィンドウが真っ白のまま固まってます。borlandのC++Builderで作成した実行ファイルも実行ウィンドウが同じ状態になりました。CD-ROM添付のサンプル実行ファイルだけはしっかり表示されました。 猫でもわかるゲームプログラミングで勉強しようとしています。 どなたか分かる方ご回答お願いしますm(_ _)m

  • C言語のプログラムが実行できません。

    C言語のプログラムが実行できません。 コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。 これは何のエラーなんでしょうか? 基本的な事かもしれませんが、分かる方宜しくお願い致します。

  • 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は全ての点に全部の辺が付いていると考えた『これ以上はないはず』といういみがあります