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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2827閲覧

トリプルポインタで配列要素を表示したい(C)

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/06/14 01:31

編集2020/06/14 02:19

トリプルポインタを用いて配列の要素を表示しようとしたのですが、segmentation fault: 11が出てしまいました。
以下が書いたコードとなります。

c

1#include <stdio.h> 2 3void main() 4{ 5 char array[3] = {'a', 'b', 'c'}; 6 char *ary_ptr; 7 char **ary_dptr; 8 char ***ary_tptr; 9 10 ary_ptr = array; 11 ary_dptr = &ary_ptr; 12 ary_tptr = &ary_dptr; 13 14 printf("**ary_dtpr %c\n", **ary_dptr); //表示結果: **ary_dtpr a 15 printf("*(*ary_dtpr + 1) %c\n", *(*ary_dptr + 1)); //表示結果: *(*ary_dtpr + 1) b 16 17 printf("***ary_tptr %c\n", ***ary_tptr); //***ary_tptr a 18 printf("**(*ary_tptr + 1) %c\n", **(*ary_tptr + 1)); //segmentation fault部分 19}

18行目のprintf("**(*ary_tptr...+ 1));の部分で,**(*ary_tptr + 1) bという結果を期待していましたが、いわゆるセグフォが起きてしまいました。ポインタの知識が浅く原因がわかりません。

なぜ要素を表示できないのでしょうか。ご教示お願いします。

######追記
現在C言語を入門書で勉強中で、データ型、演算子、関数、define、配列、ポインタまで学びました。環境はmac OS Catalina、エディタがVSCodeです。

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

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

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

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

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

thkana

2020/06/14 02:03

> printf("**(*ary_tptr + 0) %c\n", **(*ary_tptr + 0));と書いて実行してみたら、これもセグフォとなった ならないと思う...***ary_tptrと等価だもの。
退会済みユーザー

退会済みユーザー

2020/06/14 02:15 編集

編集依頼ありがとうございます。すみません、printf("**(*ary_tptr + 1) %c\n", **(*ary_tptr + 1));の以下で実行していたため、勘違いしていました。エラー部分をコメントアウトして該当部分を実行したらセグフォとはなりませんでした。修正しておきます。
guest

回答2

0

ベストアンサー

そのまま答えを書くと勉強にならないかもしれませんが、やりたいことはary_tptrでbを表示したい、として書くと

c

1printf("*(**ary_tptr + 1) %c\n", *(**ary_tptr + 1));

なぜそうなるのか順番に考えてみてください。

*ary_tptr => ary_dptr

**ary_tptr => *ary_dptr => ary_ptr

なので、

array[1] => *(ary_ptr + 1) => *(*ary_dptr + 1) => *(**ary_tptr + 1)

となります。

投稿2020/06/14 02:04

KoichiSugiyama

総合スコア3041

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

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

退会済みユーザー

退会済みユーザー

2020/06/14 02:18 編集

ご回答ありがとうございます。いただいた通り、落ち着いて分解して考えてみたら理解できました。正常に実行することができました。順番に理解するようにします。ありがとうございました。
guest

0

デバッグする環境を整えよう
Eclipseや、WindowsならVisualStudioなど
ブレークポイントで、実行を途中で止め、各変数の値を確認して、なぜそうなるかを考えてみよう。

そうすれば、ポインタの理解も深まるかと思います

#*ary_tptr + 1 ってどこを指してるのか図でも書いて考えてみよう

投稿2020/06/14 01:42

編集2020/06/14 01:50
y_waiwai

総合スコア88042

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

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

退会済みユーザー

退会済みユーザー

2020/06/14 02:11

ご回答ありがとうございます。現在エディタはVSCodeですが、デバッグ機能を全く使っておりませんでした。これを機に使って考えるようにします。 図での理解もするようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問