今私はC言語を勉強中なのですが、その中でサイズ指定のない配列について分からないことが有ります。
参考書では、サイズ指定のない配列の利点は、「配列の次元を変更せずにテーブルを長くしたり短くしたりできること」とありました。
そこで私は、実際に下記のような、参考書に載っていたサイズ指定のない2次元配列を実際に長く出来るか試してみたのですが、コンパイルするとエラーが起こり、正しく表示されませんでした。
(元の実行結果:1 2 3 4 5 6 7 8 9)
(私の予想した変更後の実行結果:1 2 3 4 5 6 7 8 9 11 12 13 21 22 23 31 32 33)
しかし、どこが悪いのかが分かりません。どこを変更すべきかどなたか教えていただけないでしょうか?
<元の配列>
int str[][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
<str[][3]を利用したソース>
#include <stdio.h>
int main(void)
{
int i, j;
int str[][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
str[3][0] = 11;
str[3][1] = 12;
str[3][2] = 13;
str[4][0] = 21;
str[4][1] = 22;
str[4][2] = 23;
str[5][0] = 31;
str[5][1] = 32;
str[5][2] = 33;
for(i = 0; i < 6; i++)
for(j = 0; j < 3; j++)
printf("%d ", str[i][j]);
return 0;
}
No.1ベストアンサー
- 回答日時:
>参考書では、サイズ指定のない配列の利点は、「配列の次元を変更せずにテーブルを長くしたり短くしたりできること」とありました。
「コンパイルの時点でコンパイラが自動計算してくれる」というだけです。
決して動的にサイズが変更できるワケではありません。
>int str[][3] = {
>{1, 2, 3},
>{4, 5, 6},
>{7, 8, 9}
>};
とりあえず、str[3][3]と書いたのと同義になります。
が、str[4][3]とか、str[1][3]とかにしたい場合に、添え字の数字を書き換えるのを忘れると問題が発生する場合があります。
# まあ、添え字より多ければコンパイルエラー、添え字より少なければメモリの無駄遣いになる程度ですが。
機能拡張とかしたりした時に、サイズが増える(減る)場合があります。
が、添え字の値まで修正し忘れる。ということはたまに発生しますので、コンパイラが自動計算してくれているだけです。
# 少なければコンパイルエラーで判明しますが、多かった場合のメモリの無駄はエラーにならないので判りません。
というわけで…
>int str[][3] = {
>{1, 2, 3},
>{4, 5, 6},
>{7, 8, 9}
>};
としておいて、
>str[3][0] = 11;
だの実行すれば、バッファオーバーランを引き起こし、どこか破壊して吹っ飛びます。
>どこを変更すべきかどなたか教えていただけないでしょうか?
動的確保なりに変更しないと無理です。
# C++のvectorだったら…よろしくやってくれるかも知れません。(動的確保をラップしてくれている。とも言えますが)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
C言語の課題が出たのですが自力...
-
C言語 ファイルの指定された行...
-
C#で構造体の配列を持った構造...
-
配列のアドレス部
-
char型配列をint型に代入するには
-
C言語の2次元配列 容量が大き...
-
C言語において、 配列要素をひ...
-
define で 配列
-
Winsockを用いてデータを交互に...
-
配列のNULL初期化について
-
C言語で質問です
-
C言語から質問です。
-
ループカウンタを使用せず、配...
-
c言語 構造体
-
char gyou[1024];でcharの表現...
-
C#で配列が空かを判定するには?
-
配列における数値の比較について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
構造体のextern方法
-
define で 配列
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
コンボボックスでデフォルト値...
-
2番目の最大値を求める
-
C言語の2次元配列 容量が大き...
-
C#で配列が空かを判定するには?
-
MFCのCArrayを使った二次元配列
-
C言語の課題が出たのですが自力...
-
C言語 ファイルの指定された行...
-
Cのエラー
-
ポインタを使って構造体の配列...
-
配列のアドレス部
-
char型配列をint型に代入するには
-
MFC - ダイアログボックスのPic...
-
C言語から質問です。
おすすめ情報