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

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

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

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

Q&A

解決済

2回答

7770閲覧

sizeof関数で構造体の配列の要素数を求めたい

pyhon_dyson

総合スコア15

C

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

0グッド

0クリップ

投稿2018/10/24 08:44

編集2018/10/24 09:01

c

1int array[] = {1,2,3,4,5};

このような配列の要素数を求める場合、

c

1sizeof(array)/sizeof(array[0])

のようにsizeof関数を使えばよいと思いますが、

c

1typedef struct{ 2 char name[64]; //名前 3 int age;    //年齢 4 int sex;    //性別 5} profile; 6 7/////////////////////////////////////////// 8/////////////////////////////////////////// 9 10int datasize = 10; 11profile *data; 12data = (profile *)malloc(sizeof(profile)*datasize); 13 14profile_scan(data); //data[0]から順に名前、年齢、性別を入力させる関数 3人のデータを入力したと仮定します。

このように作った構造体の配列に対して、

c

1sizeof(data) /sizeof(data[0])

の結果が3にならないのはどうしてでしょうか?
sizeof(array)のarrayは配列arrayの最初の要素のアドレスを表すポインタなので、同様に使えるかと思いました。

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

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

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

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

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

takabosoft

2018/10/24 08:48

data変数がどんなものか書いてください。
pyhon_dyson

2018/10/24 08:52

profile型へのポインタ変数です。
takabosoft

2018/10/24 08:56

ああ、すみません、拡張したらちゃんと書いてありました。
guest

回答2

0

ベストアンサー

sizeof(data)はsizeof(struct profile*)と等価ですので、おそらく4とか8が固定で返ってくるだけでしょう。

sizeof(array)/sizeof(array[0])

↑この書き方は基本的には固定長配列にしか使えませんのでmallocで動的に確保したものなどには適用できないと思ってください。

profile_scan(data)関数で打ち込んだ人数は、入力のループごとに1ずつカウントする変数を導入するしかないのでしょうか?

C言語ならそうなります。

投稿2018/10/24 09:02

takabosoft

総合スコア8356

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

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

pyhon_dyson

2018/10/24 09:10

sizeof関数の使い方を勘違いしておりました。 引数には名前を入れるのですね。アドレスを指定するかと思っていました。 ご教授ありがとうございました。
takabosoft

2018/10/24 09:51

変数名でも型名でもどちらでもいけます。ただしその時に何が算出されているかを誤解されていると思います。きれいにまとめてくださっている方がいらっしゃいましたので、こちらをご参考になさってください→http://www.kis-lab.com/serikashiki/C/C03.html
guest

0

dataはポインタなので、
sizeof(data)
はポインタのサイズになってしまってます

なので、その配列のサイズは、datasize をとってきてそれを使いましょう

投稿2018/10/24 08:48

y_waiwai

総合スコア88171

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

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

pyhon_dyson

2018/10/24 08:55

sizeof(array)のarrayは配列arrayの最初の要素のアドレスを表すポインタではないのでしょうか?
y_waiwai

2018/10/24 09:02

配列名は、アドレスを返すってだけで、配列とポインタは違うものです。
pyhon_dyson

2018/10/24 09:08

sizeof関数の引数が欲しいものは配列の名前そのものということですね。 なので引数にポインタを指定してもどうしようもないですね。 ありがとうございました。
y_waiwai

2018/10/24 09:11

そゆことですね ついでに。sizeof というのは演算子、ということですが一種のマクロみたいなもので、コンパイル時にコンパイラがそのサイズに置換してくれるものです。 なので、コンパイル時にそのサイズが分かってないとダメなんですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問