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

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

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

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

解決済

1回目の操作に対するコアダンプの原因が分からない。

tamajava
tamajava

総合スコア2

C

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

2回答

0評価

0クリップ

191閲覧

投稿2022/05/28 02:17

前提

C言語で最小の要素を見つける優先度付きキューを作っています。
実行後,iを入力し挿入する値を入力したところコアダンプが発生しました。
また、値が入っていない状態でdを入力してもコアダンプが発生しました。

実現したいこと

1回目の操作を正常終了するようにしたい。
(2回目以降の操作は試せていないため正しく動くか分からない)

発生している問題・エラーメッセージ

$ ./a.exe insert: i, delete: d i Input key 3 Segmentation fault (コアダンプ)

該当のソースコード

C言語

#include<stdio.h> #include<stdlib.h> #define N 100 int A[N+1]; void init(); void insert(int x, int *A, int *n); void upmin(int i, int *A, int n); void swap(int a, int b, int *A); int deletemin(int *A, int *n); void downheapmin(int i, int *A, int n); void init() { int i; for(i = 0; i <= N; i++){ A[i] = 0; } } int main(void) { int n; int *z = 0; char s[2]; init(); printf("insert: i, delete: d\n"); while(scanf("%1s", s) != EOF){ switch (s[0]){ case 'i': case 'I': printf("Input key\n"); scanf("%d", &n); insert(n, A, z); break; case 'd': case 'D': printf("key:%d\n", deletemin(A, z)); break; } printf("insert: i, delete: d\n"); } return(0); } void insert(int x, int *A, int *n) { int n1; n1 = *n; if(n1 >= N){ printf("Error: Priority queue A is full\n"); exit(1); } A[n1] = x; upmin(n1, A, n1+1); *n = n1+1; } void upmin(int i, int *A, int n) { int j; if(i >= N){ printf("Error: The value of i is wrong\n"); exit(1); } if(i == 0){ return; } j = (i-1)/2; if(A[i] < A[j]){ swap(i, j, A); upmin(j, A, n); } } void swap(int a, int b, int *A) { int tmp; tmp = A[a]; A[a] = A[b]; A[b] = tmp; } int deletemin(int *A, int *n) { int min, n1; n1 = *n; if(n1 < 1){ printf("Error: Priority queue is empty\n"); exit(1); } min = A[0]; A[0] = A[n1-1]; if(n1 > 1){ downheapmin(0, A, n1-1); } *n = n1-1; return(min); } void downheapmin(int i, int *A, int n) { int j; if(i >= N){ printf("Error: The value of i is wrong\n"); exit(1); } j = 2*i + 1; if(j >= n){ return; } if((A[2*(i+1)] < A[2*i+1]) && (2*(i+1) < n)){ j = 2*(i+1); } if(A[i] > A[j]){ swap(i, j, A); downheapmin(j, A, n); } }

試したこと

1回目の操作でエラーが出るため、main関数のint *z=0がおかしいような気がしてポインタを外してみたのですが、同様にコアダンプが起こりました。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

thkana

2022/05/28 02:23

プログラミングは、気分でやるものでもまぐれ当たりを狙ってやるものでもありません。 筋道を通して行った試行とその結果を書いてください。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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