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

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

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

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

Q&A

解決済

4回答

572閲覧

C言語で配列のサイズや指定アドレス先の配列?のサイズを知る方法を教えてください。

teityura

総合スコア84

C

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

0グッド

0クリップ

投稿2018/09/05 16:07

C言語のポインタ、難しいです。

ポインタで文字列を扱うと、
char name[10] = "Ichiro"
として、余分なメモリを消費してしまうので、
char name[] = "Ichiro"
char *name = "Ichiro"
とすると、余分なメモリを消費せずに済む?
か確かめるために、下記のコードを書いてみました。

①下記の*nameのサイズ?("Ichiro", "Jiro", "Saburo" それぞれの文字列を格納するのに必要なバイト数?)
が知りたいのですが、どのように修正したらわかりますか?(EOS含め、7,5,7になると思ってます)

②また、sizeofって、色々できるみたいで、
size(配列) / size(type)とかしないとダメで、下記のような使い方はよくないんでしょうか。

③C言語に限らず、参考書がなかなか読み進められなくて悩んでます。
疑問に思ったことを掘り下げるために、色々とprintして確かめようとすると、
更なる疑問がでてきて、最終的に混乱し、参考書が進まなくなってしまうのですが、
一旦分かった気になったら、先に進んだ方がいいのでしょうか。
(お悩み相談みたいになってしまい、すみません)

よろしくお願いします。

C

1#include<stdio.h> 2 3int main() 4{ 5 char name[3][10] = {"Ichiro", "Jiro", "Saburo"}; // 初期化時に多めにメモリを確保する必要がある 6 int i; 7 for(i=0; i<3; i++){ 8 printf("私の名前は%sです。\n", name[i]); 9 printf("sizeof(name[%d])は%dです。\n", i, sizeof(name[i])); 10 printf("\n"); 11 } 12 return 0; 13} 14

C

1#include<stdio.h> 2 3int main() 4{ 5 char *name[3] = {"Ichiro", "Jiro", "Saburo"}; // 初期化時に多めにメモリを確保する必要がない? 6 int i; 7 for(i=0; i<3; i++){ 8 printf("私の名前は%sです。\n", *(name+i)); 9 // *(name+i) &name[i] のアドレスで文字列を格納するのに必要な配列のサイズが知りたい。 10 printf("sizeof(*(name+%d))は%dです。\n", i, sizeof(*(name+i))); 11 printf("\n"); 12 } 13 return 0; 14} 15

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

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

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

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

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

guest

回答4

0

動作中のプログラムにおいて、割り当てられた配列サイズを、調べる万能な方法はありません。

終端記号をきめておくとか、サイズを別途変数に入れておくとかが必要です。sizeofでサイズを知ることができるのはコンパイル時に確定している場合のみです。

投稿2018/09/05 21:36

HogeAnimalLover

総合スコア4830

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

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

cateye

2018/09/06 08:04

“終端記号をきめておく”に一票v^^・・・構造体でも判定領域を決めておけば出来ます。
HogeAnimalLover

2018/09/06 22:54

ラッパ構造体を作るならば、可変配列用ポインタとは別要素として配列サイズ変数があれば実現できます。 終端記号でもいいですけど、この記号を別目的で使用できなくなります。
cateye

2018/09/06 23:23 編集

そうですね、私の場合は、bool valid;等を必ず設けるのでそれを基準にします。間が抜ける場合がある場合は、決して0にならない所(構造体の番号など)に0を入れる等でやってます。・・・なければアウトですが^^; c++ならstaticなカウンタを持たせますかね?
guest

0

ベストアンサー

C言語のレベルでは、char *name[3] = {"Ichiro", "Jiro", "Saburo"};が何バイト消費しているか
を知る方法は存在しません。

大抵の場合の、最低何バイトかならばstrlen("Ichiro") + strlen("Jiro") + strlen("Saburo") + 1*3 + sizeof(char*)*3になりますが
実際の消費量になるとメモリレイアウトの話等が絡んできてコンパイラによって出力された実行ファイルを精査する以外に方法がなくなります。

さらにconst char* name[3] = {"Ichiro", "Saburo", "MataSaburo"});等とすると
SaburoとMataSaburoで重複しているので節約できたりします。

投稿2018/09/05 16:58

asm

総合スコア15147

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

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

0

char *name[3]は、ポインタサイズ×3に決まっていると思うが。

投稿2018/09/06 03:35

PingHermit

総合スコア478

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

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

0

文字列の長さを知るには、strlen()です。
必要な最低限のサイズは(長さ+1)です。

1つ目のプログラムでは、char name[3][10]の10が得られます。
2つ目のプログラムでは、char *のサイズ(おそらく4か8)が得られます。

size(配列) / size(type)とかしないとダメで、下記のような使い方はよくないんでしょうか。

バイト数を知りたいときは、sizeof(配列)で、要素数を知りたいときは、sizeof(配列) / sizeof(type)またはsizeof(配列) / sizeof(配列[0])です。

投稿2018/09/05 16:22

編集2018/09/06 05:21
otn

総合スコア84533

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問