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

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

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

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

Q&A

解決済

2回答

2839閲覧

【C言語】配列の長さを取得する関数

masaya_math

総合スコア16

C

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

1グッド

0クリップ

投稿2021/08/27 06:33

質問:C言語には配列の長さを取得する関数はありますか?
質問の経緯:自分で調べた限りでは、自力で実装するしかないらしいとの結論に至ったのですが、それで正しいのかわかりません。もし標準ライブラリには存在しないなら「ありません」と、存在するならヘッダーと関数名(可能なら使い方も)お教えくださると助かります。

SaitoAtsushi👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

「配列の長さを取得する関数があるか」という質問を言葉通りに解釈するのであれば無いというのが端的な回答です。 しかしきちんと理解するには背景となる仕組みを理解する必要があります。

  • 配列として宣言された変数は配列型を持つ (たとえば int a[10]; と宣言されたときの a の型は int[10])
  • 型は大きさの情報を持っている
  • 式中に現れる配列は配列の先頭要素を指すポインタに暗黙に型変換される (int[10]int* に型変換される)
  • 配列 (配列全体) を値としてやり取りすることは出来ない (「第一級オブジェクトではない」という言い回しで表現されることがあります)
  • 配列は sizeof& のオペランドとして現れる場合に限って配列からポインタへの暗黙の型変換はされない

配列の大きさの情報を知っているのは型であって値ではないので、ポインタとなってしまった後は配列の大きさという情報は失われてしまいます。

ポインタに型変換される前なら sizeof を用いて配列の大きさを算出できるというのは thkana さんが述べている通りですが、ポインタになってしまった後に配列の大きさを知る方法はないのです。 自分で作ることも不可能です。 (少なくとも言語仕様の範囲内では。 処理系の拡張として出来るようになっている場合もあります。)

ですから、配列の大きさはプログラマが別の変数に保管するなどして管理しなければなりません。

投稿2021/08/27 07:23

SaitoAtsushi

総合スコア5466

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

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

0

ありません。

変数Aが配列型なら、演算子と計算で
sizeof(A)/sizeof(A[0])
で配列の要素数が求まるのは有名ではありますが、標準のC言語では実行中のプログラムからはAが配列型なのかを確かに知る手段がないので、Aがポインタだったりすると破綻します。

投稿2021/08/27 06:39

thkana

総合スコア7659

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問