🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

ポインタ

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

Q&A

解決済

1回答

430閲覧

c言語 ポインタの問題です

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

ポインタ

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

0グッド

0クリップ

投稿2020/12/15 03:16

ポインタの配列の数を求め、それを利用して、ポインタ配列を表示したいのですが、
適切な方法がわかりません。
いくつかの方法を試しましたが、segmentation faultが出ます。

int main (void){ int i; char a[][5] = {"A","B","C"}; char *p[] = {"A","B","C"}; // segmentation fault for(i=0;i<sizeof(a)/5;i++){ printf("a[%d] = %s\n",i,a[i]); } for(i=0;i<sizeof(p);i++){ printf("p[%d] = %s\n",i,p[i]); } // segmentation fault int n; for(i=0; ここの部分がしっくりきません ;i++){ n++; } for(i=0;i<n;i++){ printf("p[%d] = %s\n",i,p[i]); } return 0; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

こう書きます。

C

1#include <stdio.h> 2 3int main(void) { 4 int i; 5 char a[][5] = {"A", "B", "C"}; 6 char *p[] = {"A", "B", "C"}; 7 8 printf("sizeof(a)=%zu, sizeof(a[0])=%zu\n", sizeof(a), sizeof(a[0])); 9 10 /* (sizeof(a) / sizeof(a[0])) と書くことが多いが、()が多いのでこの例では除去している */ 11 for (i = 0; i < (sizeof a / sizeof a[0]); i++) { 12 printf("a[%d] = %s\n",i, a[i]); 13 } 14 15 printf("sizeof(p)=%zu, sizeof(p[0])=%zu\n", sizeof(p), sizeof(p[0])); 16 17 for (i = 0; i < (sizeof p / sizeof p[0]); i++) { 18 printf("p[%d] = %s\n",i,p[i]); 19 } 20 21 int n = 0; 22 for (i = 0; i < sizeof(p) / sizeof(p[0]); i++) { 23 n++; 24 } 25 26 printf("n=%d\n",n); 27 28 for (i = 0; i < n; i++) { 29 printf("p[%d] = %s\n",i, p[i]); 30 } 31 32 return 0; 33}

実行結果です。

terminal

1$ gcc --version 2gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 3Copyright (C) 2017 Free Software Foundation, Inc. 4This is free software; see the source for copying conditions. There is NO 5warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 6 7$ gcc -Wall t14.c 8$ ./a.out 9sizeof(a)=15, sizeof(a[0])=5 10a[0] = A 11a[1] = B 12a[2] = C 13sizeof(p)=24, sizeof(p[0])=8 14p[0] = A 15p[1] = B 16p[2] = C 17n=3 18p[0] = A 19p[1] = B 20p[2] = C 21$ 22

投稿2020/12/15 03:36

編集2020/12/15 03:49
dodox86

総合スコア9254

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

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

dodox86

2020/12/15 04:38

例えばchar *p[]についてsizeof(p)で配列全体のバイト単位のサイズ、sizeof(p[0])で配列の要素ひとつのバイト単位のサイズです。 ポインタ配列に限らず、「sizeof(p) / sizeof(p[0])」で配列の要素数、という求め方(コード)は頻出なので、覚えておくとよいと思います。
退会済みユーザー

退会済みユーザー

2020/12/16 01:15

丁寧な解説ありがとうございます。 完全に抜けてたので勉強になりました。 感謝しております!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問