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

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

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

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

Q&A

解決済

2回答

556閲覧

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

tamajava

総合スコア3

C

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

0グッド

0クリップ

投稿2022/05/28 02:17

前提

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

実現したいこと

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

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

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

該当のソースコード

C言語

1#include<stdio.h> 2#include<stdlib.h> 3 4#define N 100 5 6int A[N+1]; 7 8void init(); 9void insert(int x, int *A, int *n); 10void upmin(int i, int *A, int n); 11void swap(int a, int b, int *A); 12int deletemin(int *A, int *n); 13void downheapmin(int i, int *A, int n); 14 15void init() 16{ 17 int i; 18 for(i = 0; i <= N; i++){ 19 A[i] = 0; 20 } 21} 22 23int main(void) 24{ 25 int n; 26 int *z = 0; 27 char s[2]; 28 29 init(); 30 printf("insert: i, delete: d\n"); 31 while(scanf("%1s", s) != EOF){ 32 switch (s[0]){ 33 case 'i': 34 case 'I': 35 printf("Input key\n"); 36 scanf("%d", &n); 37 insert(n, A, z); 38 break; 39 case 'd': 40 case 'D': 41 printf("key:%d\n", deletemin(A, z)); 42 break; 43 } 44 printf("insert: i, delete: d\n"); 45 } 46 return(0); 47} 48 49void insert(int x, int *A, int *n) 50{ 51 int n1; 52 53 n1 = *n; 54 if(n1 >= N){ 55 printf("Error: Priority queue A is full\n"); 56 exit(1); 57 } 58 A[n1] = x; 59 upmin(n1, A, n1+1); 60 *n = n1+1; 61} 62 63void upmin(int i, int *A, int n) 64{ 65 int j; 66 67 if(i >= N){ 68 printf("Error: The value of i is wrong\n"); 69 exit(1); 70 } 71 if(i == 0){ 72 return; 73 } 74 j = (i-1)/2; 75 if(A[i] < A[j]){ 76 swap(i, j, A); 77 upmin(j, A, n); 78 } 79} 80 81void swap(int a, int b, int *A) 82{ 83 int tmp; 84 85 tmp = A[a]; 86 A[a] = A[b]; 87 A[b] = tmp; 88} 89 90int deletemin(int *A, int *n) 91{ 92 int min, n1; 93 94 n1 = *n; 95 if(n1 < 1){ 96 printf("Error: Priority queue is empty\n"); 97 exit(1); 98 } 99 min = A[0]; 100 A[0] = A[n1-1]; 101 if(n1 > 1){ 102 downheapmin(0, A, n1-1); 103 } 104 *n = n1-1; 105 return(min); 106} 107 108void downheapmin(int i, int *A, int n) 109{ 110 int j; 111 112 if(i >= N){ 113 printf("Error: The value of i is wrong\n"); 114 exit(1); 115 } 116 j = 2*i + 1; 117 if(j >= n){ 118 return; 119 } 120 if((A[2*(i+1)] < A[2*i+1]) && (2*(i+1) < n)){ 121 j = 2*(i+1); 122 } 123 if(A[i] > A[j]){ 124 swap(i, j, A); 125 downheapmin(j, A, n); 126 } 127} 128

試したこと

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

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

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

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

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

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

thkana

2022/05/28 02:23

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

回答2

0

ベストアンサー

C

1 int *z = 0; 23 int zero = 0; 4 int *z = &zero; 5に変えてみてはいかがでしょうか。

投稿2022/05/28 02:39

tatsu99

総合スコア5462

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

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

tamajava

2022/05/28 03:20

変更して試してみたのですが、正しく実行出来ました! ポインタに実数値0を入れるためには、0が格納されたアドレスを代入しないといけないのですね。 勉強になりました、ありがとうございます!
guest

0

int *z = 0;

これは z をヌルポインタで初期化します。
0 が格納された領域を指すポインタで初期化しているのではありません。

投稿2022/05/28 02:26

sigsegv

総合スコア895

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問