質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1058閲覧

実行エラーillegal instraction 4の原因がわからない

takadaibuoyancy

総合スコア17

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/08/10 03:00

問題

コンパイルエラーはないのですが下のコードを実行すると、illegal instraction 4と出て実行エラーになります。

手がかり

実行時はジャンケンの手を0,1,2で入力するのですが、実行エラーが起こるのは
・数字1を入力した直後(必ず)
・プログラムを起動した直後(たまに)
・0か2を入力してあいこになってAGAINと出た直後(たまに)

推測

なんとなくですが、実行エラーが出るタイミングがランダムなことからエラーの原因はおそらく、srand,randを用いた部分(---//CPUの手を決める---)にあるのではないかと考えています。

2日間ずっと考えていますが原因がわかりません。どうかお助けください。m(__)m

コード

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> typedef struct Hand{//ジャンケンの手にまつわる構造体定義 char hand[9]; int num; }HAND; int main(){ HAND *cpu=(HAND *)malloc(sizeof(HAND)),*you=(HAND *)malloc(sizeof(HAND));//CPUの手とプレイヤーの手へのポインタ char gcp[3][8]={"rock","scissors","paper"}; while(1){ //--------CPUの手を決める------------- srand((unsigned int)time(NULL)); cpu->num=rand()%3; strcpy(cpu->hand,gcp[cpu->num]); //---------プレイヤーの手を決める-------- printf("0:rock 1:scissors 2:paper >"); scanf("%d",&you->num); while(you->num<0 || 2<you->num){//123以外が入力されたら催促する。 printf("0:rock 1:scissors 2:paper >"); scanf("%d",&you->num); } strcpy(you->hand,gcp[you->num]); //---------------勝敗判断--------------- if(cpu->num==you->num){ printf("CPU:%s\nYOU:%s\n AGAIN\n",cpu->hand,you->hand); continue; } else if((cpu->num+1)%3==you->num){ printf("CPU:%s\nYOU:%s\n YOU LOSE\n",cpu->hand,you->hand); break; }else{ printf("CPU:%s\nYOU:%s\n YOU WIN\n",cpu->hand,you->hand); break; } //------------------------------ } return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「scissors」は8文字あるので、C言語の文字列として保存するには(末尾のヌル文字も含めて)9文字分の領域が必要です。

Diff

1- char gcp[3][8] = {"rock", "scissors", "paper"}; 2+ char gcp[3][9] = {"rock", "scissors", "paper"};

提示されたコードだと、gcp[1]にアクセスすると「scissorspaper」が得られてしまうため、これをstrcpyする対象cpu->handyou->handバッファーオーバーフローを起こします

このため、

・数字1を入力した直後(必ず)

は、you->handのバッファーオーバーフローが原因で、

・プログラムを起動した直後(たまに)
・0か2を入力してあいこになってAGAINと出た直後(たまに)

は、CPUがランダムにチョキを選択した結果、cpu->handのバッファーオーバーフローが原因です。

投稿2020/08/10 03:13

編集2020/08/10 03:14
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問