二次元配列、三次元配列のサイズが知りたいです。
unsigned char test1[100];
は sizeof( test1 )で100ですが、
unsigned char test1[100][30];
はどのように書いたら100または、30なのか知りたいです。
unsigned char test1[100][30][5];
これも100,30,5のサイズをそれぞれ得る方法が知りたいです。
因みに以下のような数値なし[]を見たことがあるのですが
どういう意味でしょうか?
unsigned char test1[][30];
サイズを理解していないのは、ポインタを理解していないと同じことでしょうか?今更ながら自分自身が不安です。
No.4
- 回答日時:
まず、配列の添え字付け、すなわちarray[s]は*(array+s)と等価になります。
そして、array+sの部分ですが、ポインタと整数型の加算の結果が、配列オブジェクトの要素または配列オブジェクトの最後の要素を越えたところを指すことはできますが、それ以外の場合(オーバーフローを生じた場合)の動作は未定義なります。次に、*演算子ですが、オペランドであるポインタの値が正しくない場合の動作は未定義になります。この場合の「正しくない値」というのは、「配列オブジェクトの最後の要素を越えたところ」も含むと思われます。
sizeof演算子は、可変長配列でない限りオペランドを評価しません。未定義の動作は必ずしも実行時のことだけではなく、コンパイル時にエラーやその他の誤動作を生じてもおかしくはないのですが、*演算子のオペランドの値が正しいかどうかは評価されなければわからないので、これはないはずです。結果としてsizeof ary[100]は問題ないと思いますが、見た人を困惑させるには十分な表現ですので、避けるべきでしょうね。
No.3
- 回答日時:
C言語の仕様上は、配列の添え字として、配列の定義外を使ってはいけないという制限はなかったような。
例えば、
unsigned char test[100];
という配列があったとして、
test[100]
とか、
test[120]
とか、
test[-1]
とかも(言語の仕様上は)有効なはず。
ただ、普通は、こういうアクセスをするとメモリ破壊になるからやってはいけない、ってだけだったと思います。
だから、sizeof(test[100])は、OKだと思う。
今、言語仕様が手元にないので、もしかしたら、間違ったことを言っているかもしれませんが。
No.2
- 回答日時:
No.1さんの回答は、sizeofのところで配列の定義外の添字を使っているために破綻します。
正しくは下のとおりです。
#include <stdio.h>
int main(void)
{
unsigned char test1[100];
unsigned char test2[100][30];
unsigned char test3[100][30][5];
printf("%d\n", sizeof(test1) / sizeof(test1[0]));
putchar('\n');
printf("%d\n", sizeof(test2) / sizeof(test2[0]));
printf("%d\n", sizeof(test2[0]) / sizeof(test2[0][0]));
putchar('\n');
printf("%d\n", sizeof(test3) / sizeof(test3[0]));
printf("%d\n", sizeof(test3[0]) / sizeof(test3[0][0]));
printf("%d\n", sizeof(test3[0][0]) / sizeof(test3[0][0][0]));
return 0;
}
(注)インデントのため、全角空白を使っています。
No.1
- 回答日時:
えーとこういう答えがお望み?
#include <stdio.h>
unsigned char ary[100][30][5];
int
main()
{
printf("%d\n", sizeof ary / sizeof ary[100]);
printf("%d\n", sizeof ary[100] / sizeof ary[100][30]);
printf("%d\n", sizeof ary[100][30]) / sizeof ary[100][30][5];
return 0;
}
bash-3.2$ gcc size.c
bash-3.2$ ./a
100
30
5
> 因みに以下のような数値なし[]を見たことがあるのですが
> どういう意味でしょうか?
> unsigned char test1[][30];
配列の「定義」ではなく「宣言」の場合は最上位の次元を省略することが
許されます。
で、それをしているだけ。
関数の引数に多次元配列を渡すときのプロトタイプとかで使いますね。
> サイズを理解していないのは、ポインタを理解していないと同じことでしょうか?
Cにおいて配列とポインタはしばしば互換性を持っていますが、
別物です。同じことではないでしょう。
Cの理解が足りないという意味では同じかもしれませんが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- Visual Basic(VBA) Excle VBA Findメソッドについて 3 2022/07/15 13:56
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
c#について、現在テトリスを作...
-
LGノートPCグラムについて
-
多次元配列のポインタ渡し
-
【速いブラインドタッチ】手を...
-
先頭アドレスとは何ですか?
-
本日までの累計を表示させたい!
-
テキストファイルから文字列を...
-
パスカルの三角形
-
市販のビンゴカードについて
-
Excel、VBAのユーザーフォーム...
-
VBでC言語のポインタみたい...
-
2次元配列を確保したいのですが、
-
vectorで文字列の配列を使う方法
-
C言語で特定列だけを抽出して配...
-
unsigned char配列への入力の仕方
-
C言語の配列のサイズ
-
アルファベットの配列を数字の...
-
VBで構造体の配列を関数に渡す...
-
教えてください。 配列とポイン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
unsigned char配列への入力の仕方
-
ExcelVBAで質問です。離れた二...
-
配列の参照渡しで型が一致しま...
-
パイソンの
-
C# Listを使わずに2次元配列の...
-
C言語で特定列だけを抽出して配...
-
複数の選択範囲の行番号を個別...
-
【C言語】配列の中に配列を入れ...
-
メモリの初期値
-
VBで構造体の配列を関数に渡す...
-
Excel、VBAのユーザーフォーム...
-
2次元配列を戻り値とする関数?
-
配列をEraseしてもメモリが開放...
-
【速いブラインドタッチ】手を...
おすすめ情報