エラー「Segmentation fault (core dumped)」の原因と解決策

このQ&Aのポイント
  • Win2k+Cygwin1.5.11(0.116/4/2)環境で発生する「Segmentation fault (core dumped)」エラーの原因と解決策を解説します。
  • 質問者は変数のビットでの値を別ウィンドウで表示する実験をしており、「./test.exe」を実行したところ「Segmentation fault (core dumped)」エラーが発生しました。
  • エラーが発生した原因や解決策について詳しく教示してください。
回答を見る
  • ベストアンサー

エラー「Segmentation fault (core dumped)」が

Win2k+Cygwin1.5.11(0.116/4/2)の環境です。 変数のビットでの値を別ウィンドウで表示する実験をしています。 下記のリストで $ ./test.exe Segmentation fault (core dumped) となってしまいます。 これは何が原因なのでしょうか? ご教示いただければ幸いです。 //test.c #include<stdio.h> #include<curses.h> #include<string.h> void getPrtBits(char *bitStr,long x){ int i,j; for(i=32-1,j=37;i>=0;i--,j--){ if((i<32) && (i+1%4==0)){ bitStr[j]=' '; j--; } if((x>>i)&1) bitStr[j]='1'; else bitStr[j]='0'; } return; } //==================== void hyouji(char* hiyoujishitaimojiretsu,long x){ nocbreak(); echo(); WINDOW *wndw; mvwprintw(wndw,1,1,"%s",hiyoujishitaimojiretsu); mvwprintw(wndw,2,1,"%ld",x); touchwin(wndw); wrefresh(wndw); delwin(wndw); cbreak(); noecho(); return; } //============= void bit_hyouji(char* hiyoujishitaimojiretsu,long x){ char c,bitStr[39]; int i,j; bitStr[38]='\0'; memset(bitStr,'0',38); nocbreak(); echo(); WINDOW *wndw=newwin(5,80,1,1); mvwprintw(wndw,1,1,"%s",hiyoujishitaimojiretsu); getPrtBits(bitStr,x); mvwprintw(wndw,2,1,"%s",bitStr); touchwin(wndw); wrefresh(wndw); scanf("%c",&c); delwin(wndw); cbreak(); noecho(); return; } //=============== int main(void){ long n=1; initscr(); hyouji("n=",n); bit_hyouji("bits of n=",n); endwin(); return 0; }

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

void hyouji(char* hiyoujishitaimojiretsu,long x) で WINDOW *wndw;← ウィンドウを作成せずに使っています。

matsui888
質問者

お礼

> void hyouji(char* hiyoujishitaimojiretsu,long x) > で > WINDOW *wndw;← > ウィンドウを作成せずに使っています。 そうでした! WINDOW *wndw=newwin(5,80,1,1); としないといけませんでした。 どうも有り難うございました。 解決しました。

関連するQ&A

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

  • プログラミングに関する問題が解けません;;

    1 「ファイルの入出力」 以下のプログラムはdata.txtのデータを読み込み,画面に出力するものです. 下記のプログラムの######を埋めて完成させよ. #include <stdio.h> #include <stdlib.h> int main(void){     char dummy[128], filename[128];     FILE *fp;     char x;   sprintf(filename,"data.txt");     fp=fopen(filename, "r");     if(#####(1)####) {        printf("ファイル%s が見つかりません\n",filename);        return(-1);      } while(#########(2)############){ putchar(x); } fclose(fp); return(0); } 2 構造体を用いたプログラム 名前と点数用のメンバを持つ構造体dataを宣言しなさい。 また、名前と点数を表示する関数hyoujiを完成させよ。 #include <stdio.h> (1) void hyouji(###(2)###, int no); int main(void){ struct data member[3] = {{"伊藤", 71},{"小林", 81},{"山田", 67},}; hyouji(member, 3); } void hyouji(####(3)####, int no){ int i; for(i=0; i<no; i++){ printf("%s:%d\n", ###(4)###); mem++; } } 3 「2次元配列を使った行列の四則演算」 次のプログラムは、2次元配列の和を求め結果を表示するためのものである. 関数 mat_tasu()の中身を完成させよ. ただし関数 mat_tasu()は引数を持たない関数とします. #include<stdio.h> int ma[2][2]={{1,2}, {3,4}}; int mb[2][2]={{5,6}, {7,8}}; int mc[2][2]; void mat_tasu(void); int main(void) { int i,j; mat_tasu(); for (i=0; i<2; i++){ for (j=0; j<2; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); } /* 行列の和の計算 */ void mat_tasu(void) {      (1) } 各問題の(1)や(2)みたいになってるところに当てはまるプログラミングを教えてください! 一問だけでもいいので分かる方いましたら、回答お願いいたします!

  • segmentation fault

    ソースは以下です 途中までは実行されるんですけど,,, 教えてください #include <stdio.h> #include <stdlib.h> #include <math.h> #define M_PI 3.14159265358979 /* 円周率 */ int main(int argc, char **argv) { int xsize,ysize,depth,x,y,c; char code[10]; FILE *fp; unsigned char ***image,***outimage; double sum_kido,sum_kido_x,grad; int xmax,xmin,ymax,ymin,count; char grad_im; int sumx, sumy, N; char dummy[1024]; double Deltax; double Deltay; if(argc != 3){ fprintf(stderr,"Usage : a.out input_filename output_filename\n"); exit(1); } if((fp=fopen(argv[1],"r"))==NULL){ fprintf(stderr,"File can not open : %s\n",argv[1]); exit(1); } fscanf(fp,"%s",code); /* fscanf(fp,"%s",dummy); */ fscanf(fp,"%d %d",&xsize,&ysize); fscanf(fp,"%d ",&depth); fprintf(stderr,"%s, %d, %d, %d\n",code,xsize,ysize,depth); getchar(); image = (unsigned char ***)malloc(sizeof(unsigned char**)*ysize); for(y=0;y<ysize;y++){ image[y] = (unsigned char **)malloc(sizeof(unsigned char*)*xsize); for(x=0;x<xsize;x++){ image[y][x] = (unsigned char *)malloc(sizeof(unsigned char)*3); } } outimage = (unsigned char ***)malloc(sizeof(unsigned char**)*ysize); for(y=0;y<ysize;y++){ outimage[y] = (unsigned char **)malloc(sizeof(unsigned char*)*xsize); for(x=0;x<xsize;x++){ outimage[y][x] = (unsigned char *)malloc(sizeof(unsigned char)*3); } } // load image for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ for(c=0;c<3;c++){ image[y][x][c] = (unsigned char)(fgetc(fp)); printf("%d\n", image[y][x][c]); } } } fclose(fp); sumx = 0; sumy = 0; N = 0; for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ if((image[y][x][0]*2<image[y][x][2])&&(image[y][x][1]*2<image[y][x][2])){ outimage[y][x][0]=255; outimage[y][x][1]=0; outimage[y][x][2]=0; }else{ outimage[y][x][0]=image[y][x][0]; outimage[y][x][1]=image[y][x][1]; outimage[y][x][2]=image[y][x][2]; sumx += x; sumy += y, N += 1; } } } // output image if((fp=fopen(argv[2],"w"))==NULL){ fprintf(stderr,"File can not open : %s\n",argv[2]); exit(1); } fprintf(fp,"%s\n",code); fprintf(fp,"%d %d\n",xsize,ysize); fprintf(fp,"%d\n",depth); count = 0; for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ for(c=0;c<3;c++){ fputc(outimage[y][x][c],fp); } } } fclose(fp); fprintf(stdout, "%d, %d, %d, Gravity (x,y) = (%lf, %lf)\n",sumx,sumy,N,(double)(sumx)/(double)(N), (double)(sumy)/(double)(N)); for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ Deltax = sqrt(( pow (image[x+1][y][0] , 2.0 ) + pow (image[x+1][y][1] , 2.0 ) + pow (image[x+1][y][2] , 2.0 )) - ( sqrt( pow (image[x-1][y][0] , 2.0) + (image[x-1][y][1] , 2.0) + (image[x-1][y][2] , 2.0)))); Deltay = sqrt(( pow (image[x][y+1][0] , 2.0 ) + pow (image[x][y+1][1] , 2.0 ) + pow (image[x][y+1][2] , 2.0 )) - ( sqrt( pow (image[x][y-1][0] , 2.0) + (image[x][y-1][1] , 2.0) + (image[x][y-1][2] , 2.0)))); } } for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ double T = atan( Deltax / Deltay ); //勾配ベクトルの方向 double U = sqrt( pow ( Deltax , 2.0 ) + pow (Deltay , 2.0 ) ); //勾配ベクトルの勾配量  double V = atan( ( x - (double)(sumx) / (double)(N) ) / ( y - (double)(sumy) / (double)(N) ) ); printf(" %f\n " , V - ( T + ( M_PI / 2 ))); } } }

  • 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; /*ファイルポインタ*/

  • abcdとキーボードで打ったらdcbaと表示されるプログラム

    C言語に関しては初心者です。 メイン関数は変更せずに行います。 /* reverse.c: reverse a given string */ #include <stdio.h> #include <string.h> void reverse(char *); /* プロトタイプ宣言 */ int main(void) { char str[100]; scanf("%s", str); reverse(str); printf("%s\n", str); return (0); } void reverse(char *s) { char n; int i; char str; n = strlen(str) - 1; for(i=0,i++,i<=100) { s[i] = *s[n-i]; printf("%s\"s[i]); } }

  • 文字列とポインタの問題です。

    #include<stdio.h> int f(char *s); int main(void){ char*str="nasida Institute of Technology"; int i; i=f(str); printf("%s:%d\n",str,i); return 0; } int f(char *s) { int j=0; while(*s!='\0'){ if(*s=='t'){ j++; } s++; } return j; } このプログラムの答えが3になるんですが、if文のとこの動作がよく分からないので、よろしくお願いします。

  • strcpyのsegmentation fault

    118 char* argv[argc+1]; 120 121 for(i = 0; i < argc ; i++) 122 { 123 char tmp[BUF]; 124 while(buf[k]!=' ' & buf[k]!='\0') 125 { 126 tmp[j] = buf[k]; 127 j++; 128 k++; 129 } 130 tmp[j]='\0'; 131 j=0; 132 k++; 133 strcpy(argv[i],tmp); 134     //arg v[array]=tmp; 135 printf("temp = %s argv = %s\n",tmp,argv[array]); 136 } 137 argv[i+1]=tmp2; 133番の部分が問題です 最初に回る時にはprintfの結果が出ます temp = test argv = test でも2回目からはerrorになるます argv[1]は char*刑なのでstrcpyに何の問題もないと思いますが どんな問題でerrorがでるのでしょうか? これはlineを呼んで int main(int argc, char* argv[]) のargv部分をようにするためのcodeです errorの理由とか char* argv[]部分を簡単に作る方法を知りたいです お願いします

  • 文字の並べ替え

    C言語で文字の並べ替えをしたいのですが条件があり ポインタを使って文字を並べ替える別の関数をを渡さなければなりません.(void reverse(char *str)をつくる) そこで作ったのが #include <stdio.h> #include <string.h> void reverse(char *str); int main(void){ char s[80]; gets(s); reverse(s); printf("%s\n",s); return 0; } void reverse(char *str){ char q[80]; int i,n; n=strlen(str)-1; str+=n; for(i=0;i<=n;i++)q[i]=*str--; str++; q[i]='\0'; for(i=0;i<=n;i++)*str++=q[i]; } なのですが ポインタを使っている意味が余りないので ポインタを使うよりよいプログラムを教えてください. (アドバイスでもかまいません.)

  • c言語についてです。

    文字の順番を逆さまにするプログラムなのですが実行してenterキーを押しても何もおこりません。原因がわかる方がいたら教えてほしいです。 初歩的な質問ですみません。 使っているパソコンはMacBookProです。 #include<stdio.h> void reverse(char[],char[]); void divide(char[],char[]); int main(void) { char s[100],t[100]; gets(s); reverse(s,t); divide(t,s); printf("%s %s\n",s,t); return 0; } void reverse(char s[],char t[]) { int i=0,j=0; while(s[i]!=0){ i++; } i--; while(i>=0){ t[j]=s[i]; i--; j++; } t[j]=0; return ; } void divide(char t[],char s[]){ int i=0,j=0; while(t[j]!=' '){ i++; } t[i]=0; i++; while(t[i]!=0){ s[j]=t[i]; j++; i++; } s[j]=0; return ; }

  • 配列について

    初歩的な質問ですいませんが、質問よろしくお願いします。 ◎1----------------------------- #include<stdio.h> int main(void) { char ss[10]="AB"; printf("ss=%s\n",ss); return 0; } ------------------------------------ ◎2-------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss[0]='A'; ss[1]='B'; ss[2]=0; printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎3------------------------------- #include<stdio.h> #include<string.h> int main(void) { char ss[10]; strcpy(ss,"AB"); printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎4------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss="AB"; printf("ss=%s\n",ss); return 0; } ---------------------------------- 以上4つのプログラムで、◎2と◎3は正常に動くと理解できたのですが、何故、◎1は正常に動き、◎4は「'const char [3]' から 'char [10]' に変換できません。」といったようなエラーが出てしまうか分かりません。 教えていただければ嬉しいです。

専門家に質問してみよう