人に聞けない痔の悩み、これでスッキリ >>

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

コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。

これは何のエラーなんでしょうか?
基本的な事かもしれませんが、分かる方宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

僕も何度も出したなぁ。



ひとくちにSegmentation faultといっても、それこそさまざまな要因があるので、
これだけで原因を突き止めるのは非常に難しいです。

コンパイルはあくまで文法としてみているだけであり、
処理の流れ、メモリ確保など、プログラムそのものを見ているわけではありません。
このエラーが出るのは文法などよりもっと上位の原因なのです。
たとえばですが。
長さ10の配列があったとして、11番目以降を参照したりすると、
そういうのが出たような気がします。

ですから、変数があれば、その内容をprintf文で逐一出していき、
変な値が入っていないとか、少しずつ直していくしかないと思います。
    • good
    • 2
この回答へのお礼

ありがとうございます。
解決しました。
どうやら、プログラムの記述にミスがあり、ループがうまくいってなかったようです。

なるほど、勉強になりました。ありがとうございます。

お礼日時:2007/01/12 19:59

エラーの内容としては、


確保された安全な領域以外を参照したことによるエラーと捉えても良いと思います。
例えば、配列の添え字を間違えて確保されていない部分を参照したり、ポインタの演算を間違えてまったく関係ないところを参照したりしたときにも発生します。

原因を特定するとして、
仮に、Windows上のVisualC++などでデバッグモードで実行している場合などであれば、Segmentation faultが発生しているところで停止したりするので原因の特定が楽なのですが、
それ以外の環境で調査するとしたら、#1さんが書かれているように、ところどころにprintf等を入れて、変数の内容を出力させるなどして動作確認するしかないでしょう。
上記発生原因の例を参考に、配列の添え字や、ポインタ操作の度に内容確認されてはいかがでしょうか?
    • good
    • 1
この回答へのお礼

ありがとうございます。
解決しました。
メモリの確保も大事なんですね。
勉強になりました。本当にありがとうございました。

お礼日時:2007/01/12 20:01

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qセグメンテーション違反

C言語を使用しています。

構造体に値をいれようとしたら、コンパイルは出来るのですが、実行時に
「セグメンテーション違反です (core dumped)」
となってしまい、それ以上行えません。

構造体と代入したい変数との型は、合っています。

いろいろ本などで見ましたが、何が原因かわからず困っています。
教えてください。
宜しくお願いします。

Aベストアンサー

OSは何でしょうか。コンパイラは何を使用していますか?
通常、デバッグオプションをつけて実行すると、異常の発生したソースの箇所で止まりますので、それが手がかりになります。またNo1の方が言われてますように、ソースが公開できるのであれば、ソースを提示するのが良いかと思います。

Qセグメンテーション違反とは??

linuxでC言語のプログラムを構築しています。
gccでコンパイルしたときにセグメンテーション違反という
エラーが出てしまいます。
セグメンテーション違反とは一体なんの
ことなんでしょうか?
メモリのことだと思ってるんですが、原因がよくわかりません。C言語初心者なので
わかりやすく教えて頂けるとありがたいです。

Aベストアンサー

似たような質問を発見しました。以下のURLを参考にしてみてはどうでしょうか?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=715484

QC言語のポインターに関する警告

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int=i; /*main関数内のfor文で使用*/
char line[100], out[100];
void change(int);

/*関数*/
void change(int i)
  {
   if(line[i]=='1'){
    out[10]="a\0"
   }if(line[i]=='2'){
    out[10]="b\0";
   }if(line[i]=='3'){
    out[10]="c\0"
}
}

line[100]で
「1」が格納されていたら「a」
「2」が格納されていたら「b」
「3」が格納されていたら「c」
とout[100]に代入する関数を作りたいのですが
コンパイルすると関数の部分で
warning: assignment makes integer from pointer without a cast
という警告がでます。
ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。
どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。
解決法をおしえてください。お願いします。

/*宣言*/
int...続きを読む

Aベストアンサー

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(line[i]=='1'){
    out[10]=0x61; /* aのASCIIコード */
   }if(line[i]=='2'){
    out[10]=0x62; /* bのASCIIコード */
   }if(line[i]=='3'){
    out[10]=0x63; /* cのASCIIコード */
}
}
と書きましょう。

>    out[10]="a\0"
>    out[10]="b\0";
>    out[10]="c\0"

"a\0"や"b\0"や"c\0"は「charへのポインタ」ですよ。

out[10]は「char」ですから「記憶域が小さい整数(つまり、charに)に、ポインタを代入すると、値が失われるぞ」と警告が出ます。

void change(int i)
  {
   if(line[i]=='1'){
    out[10]='a';
   }if(line[i]=='2'){
    out[10]='b';
   }if(line[i]=='3'){
    out[10]='c';
}
}
または
void change(int i)
  {
   if(l...続きを読む

Qセグメントエラー

Cプログラムを実行した時に発生する、セグメントエラー
は何が原因なのでしょうか?
コンパイルはちゃんとととっているのに、
なぜエラーがでるのでしょうか?
C言語の本を見たのですが、
のってません。
お願いします。

Aベストアンサー

こんにちわ。

「セグメントエラー」ってSegmentation Fault の事ですよね。
そうであれば、メモリのアクセス侵害です。
原因としては、
・アクセスできない筈のアドレス (NULL アドレスとか) にアクセスした
・獲得したアドレスを越えてアクセスした。
・初期化していないポインタ変数を使ってアクセスした。
と言う感じです。

ケースとしては少ないと思いますが、1つの変数 (領域) を複数の
データ型でアクセスした場合に、起きる事があります。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Qセグメンテーション違反について

C言語であるプログラムを作っています。コンパイルは上手くできるのですが、実行するとセグメンテーション違反と出てしまいます。それもセグメンテーション違反と出るときと出ないときがあり困っています。そこでプログラム中のどこがセグメンテーション違反を指しているのか知りたいのですが、何かセグメンテーション違反の場所を教えてくれるようなオプションはないでしょうか? プログラムソースを見てもらうのが一番いいと思いますが、行数が1000行を超えているので断念しました。OSはLinuxでコンパイラはgccです。どなたかご教授お願いします。

Aベストアンサー

デバッガを使おう。
「gcc デバッガ」で検索すると色々出てくる。

QSegmentation 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);
}

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,...続きを読む

Aベストアンサー

大事なことは、せっかく配列の添字が0から始まるのを考慮して、
taro=taro-1;
hanako=hanako-1;
しているのに、judgeの時にそれを忘れている事。
だから、kekka[number]のnumberは、-1してやらねばなりません。
もう一つ大事なこと、
kekka[number][MAX_LINE]は、評価結果が文字型である、という事。
で、printfは、%sと解釈しますので、それを参照先として、つまりポインタとして読もうとします。
ここで表示したいのは、「勝ち」「負け」などの文字列ですので、その先頭へのポインタを渡さねばなりません。
kekka[number]は、それぞれの文字列の先頭へのポインタになります。
以下のコメントの後の文を追加すると、いいでしょう。
あ、あと、入力の前には、プロンプトくらい出したほうがいいと思いますよ。

#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] = {"太郎の勝ち",
"花子の勝ち",
"あいこ"
};
/**********************/ printf("1=グー 2=チョキ 3=パー\n");
/**********************/ printf("太郎 : ");
gets(buffer);
taro = atoi(buffer);
taro = taro-1;
/**********************/ printf("花子 : ");
gets(buffer);
hanako = atoi(buffer);
hanako = hanako-1;

number = judge[taro][hanako];

/**********************/ number-=1;

printf("じゃんけんの結果は%sです。\n",kekka[number]
/**********************/ /*[MAX_LINE]*/ /* ←削除 */
);

return(0);
}

大事なことは、せっかく配列の添字が0から始まるのを考慮して、
taro=taro-1;
hanako=hanako-1;
しているのに、judgeの時にそれを忘れている事。
だから、kekka[number]のnumberは、-1してやらねばなりません。
もう一つ大事なこと、
kekka[number][MAX_LINE]は、評価結果が文字型である、という事。
で、printfは、%sと解釈しますので、それを参照先として、つまりポインタとして読もうとします。
ここで表示したいのは、「勝ち」「負け」などの文字列ですので、その先頭へのポインタを渡さねばなりません。
kekk...続きを読む

QSegmentation Fault (メモリ制限?)

Segmentation Fault (Fortranのプログラム)に関して質問です。


あるデータを処理するプログラムですが、小さなデータの場合問題ないですが、
大きなデータを扱うようになった場合Segmentation Faultとなります。

宣言している配列サイズを超えた部分のアクセスなどでSegmentation
Faultが出ることがあるようですが、どうやらそのような現象ではなく、
メモリ制限にひっかかっている感じがいたします。


エラーが出る部分はどうやらSubroutine内の大きなデータ宣言を
している部分のようです。(下の例ではtest bが表示れる以前に止まります。)

!--------------------------------------------------
subroutine calc_tri( )

implicit none

real*8 data1(3,200000) !<--- ここでエラー -->

write(6,*) 'test b'
!--------------------------------------------------


このような場合、配列データを減らす以外にどのような対策が
あるのでしょうか?
あるいはメモリ制限になりそうなデータ数が分る方法などあります
でしょうか?


環境は
linux (CentOS)
intel Fortran Compiler version 8.0
Mem: 1GB

topコマンドにて Memの使用割り合いは10%にもならないのですが
コンパイラによるメモリ制限などもあるのでしょうか?

subroutine内の配列の宣言はデータ数より多くとっていることは確認しています。

Segmentation Fault (Fortranのプログラム)に関して質問です。


あるデータを処理するプログラムですが、小さなデータの場合問題ないですが、
大きなデータを扱うようになった場合Segmentation Faultとなります。

宣言している配列サイズを超えた部分のアクセスなどでSegmentation
Faultが出ることがあるようですが、どうやらそのような現象ではなく、
メモリ制限にひっかかっている感じがいたします。


エラーが出る部分はどうやらSubroutine内の大きなデータ宣言を
している部分のようです。(下...続きを読む

Aベストアンサー

スタックオーバフローを起こしているのでは。
ulimitとかでスタックサイズを引き上げるか、ALLOCATABLEな配列にしてヒープ領域を使うようにするとか。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング