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

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

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

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

Q&A

解決済

2回答

2106閲覧

C言語 スタック core dump

junnnnchan

総合スコア26

C

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

0グッド

0クリップ

投稿2020/06/01 05:15

編集2020/06/01 05:31
#include <stdio.h> #define MAX 10 /*--- int 型スタックを実現する構造体 ---*/ typedef struct { int max; /* スタックの容量 */ int ptr; /* スタックポインタ */ int stk[MAX]; /* スタック本体*/ } PhysCheckStack; typedef struct{ double vision; /* 視力 */ int height; /* 身長 */ } Body ; /*--- 身体検査データ型 ---*/ typedef struct{ Body body; /* 身体データ型 ---*/ char name[20]; /* 氏名 */ } PhysCheck ; /*--- スタックの初期化 ---*/ int Initialize(PhysCheckStack *s, int max){ s->ptr = 0; s->max = max; return 0; } /*--- スタックにデータをプッシュ ---*/ int Push(PhysCheckStack *s, char x){ if (s->ptr >= s->max) return -1; /* スタック満杯 */ s->stk[s->ptr] = x; s->ptr++; return 0; } // /*--- スタックからデータをポップ ---*/ // int Pop(PhysCheckStack *s, int *x){ // if (s->ptr <= 0) return -1; /* スタックは空 */ // s->ptr--; // *x = s->stk[s->ptr]; // return (0); // } // /*--- スタックからデータをピーク ---*/ // int Peek(PhysCheckStack *s, int *x){ // if (s->ptr <= 0) return -1; // *x = s->stk[s->ptr - 1]; // return 0; // } /*--- スタックの容量 ---*/ int Capacity(const PhysCheckStack *s){ return s->max; } // /*--- スタックに積まれているデータ数 ---*/ int Size(const PhysCheckStack *s){ return s->ptr; } /*--- スタックの全データの表示 ---*/ void Print(const PhysCheckStack *s){ int i; for(i = 0; i < s->ptr; i++) printf("'%s' ", s->stk[i]); putchar('\n'); } int main(void){ PhysCheckStack s; Initialize(&s, MAX); while (1) { int menu; char y, x; printf("現在のデータ数:%d/%d\n",Size(&s), Capacity(&s)); printf("(1) プッシュ (2) ポップ (3) ピーク (4) 表示 (0) 終了:"); scanf("%d", &menu); if (menu == 0) break; switch (menu) { case 1: /* プッシュ */ printf("データ:"); scanf("%s", &y); if (Push(&s, y) == -1) puts("\a エラー:プッシュに失敗しました。"); break; // case 2: /* ポップ */ // if (Pop(&s, &x) == -1) // puts("\a エラー:ポップに失敗しました。"); // else // printf("ポップしたデータは%d です。\n", x); // break; // case 3: /* ピーク */ // if (Peek(&s, &x) == -1) // puts("\a エラー:ピークに失敗しました。"); // else // printf("ピークしたデータは%d です。\n", x); // break; case 4: /* 表示 */ Print(&s); break; } } return 0; }

デバッグを行ったところ、 Initialize(&s, MAX);でreturn 0を返した後、printf("現在のデータ数:%d/%d\n",Size(&s), Capacity(&s));を表示するときに、stk = {4196445, 0, -5136, 32767, 0, 0, 4196368, 0, 4195648, 0}という値が代入されています。
なぜこのような値が代入されたのか知りたいです。
よろしくお願いします

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

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

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

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

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

y_waiwai

2020/06/01 05:25

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

回答2

0

ベストアンサー

stk = {4196445, 0, -5136, 32767, 0, 0, 4196368, 0, 4195648, 0}という値が代入されています。

C言語では自動変数は明示的に初期化しない限り不定値です。
代入されてるのではなく、Initialize(&s, MAX);stk[0]stk[MAX-1]を初期化していないため不定値が入っているだけです。

投稿2020/06/01 05:29

SHOMI

総合スコア4079

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

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

junnnnchan

2020/06/01 05:32

なるほど! 有難うございます!
guest

0

宣言しただけで値を設定していないローカル変数(のメンバー配列)なので、中身に何が入っているかはそのときのメモリ次第です。

投稿2020/06/01 05:32

Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問