![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.1ベストアンサー
- 回答日時:
普通の配列では例外は発生しません。
arrayのatメンバ関数を使えば同様のことが実現できるはずです。
#include <array>
#include <stdio.h>
void func(std::array<int, 5>& a){
try{
a.at(5)=1;
}catch(...){
printf("error!");
}
}
int main(){
std::array<int, 5> a;
func(a);
}
> 安全に動作するようにするには
mainの返却値をintにしないと未定義の動作になります。
また、printfを使うのであれば、<stdio.h>をインクルードする必要があります。
No.3
- 回答日時:
おかしな回答があるので再度回答します。
> void func(int a[5])
↑のように書いても、aは配列型ではなくポインタ型になります。
したがって、sizeof(a)/sizeof(a[0])と書いても、要素数は取得できず、でたらめな結果しか得られません。
単純な配列で要素数も関数に渡したいのであれば、別の引数として渡すか、次のようにテンプレートを使います。
template <std::size_t N>
void func(int (&a)[N])
{
/* 省略 */
}
あるいは、サイズが必ず5なのであれば、
void func(int (&a)[5])
{
/* 省略 */
}
としてもよいでしょう。
訂正ありがとうございます。
初心者のため配列の取り扱いには
悩まされているので、
こういった情報は本当にためになります。
ありがとうございました。
No.2
- 回答日時:
言語仕様上、
func(int* a)
で受けたaは「ポインタ」であり、このポインタは「int配列のどこを指しているか判らない」ので、範囲チェックは出来ません。
例えば、呼び出し元で
func(&a[2]);
として呼び出すと、func関数内での有効な添え字の範囲は「-2から2」になります。
いつも有効範囲が「0~4」だとは限らないのです。
なので、配列の添え字は、基本「範囲チェックもされないし、範囲外をアクセスした場合は動作が未定義」なのです。
以下のように、引数をポインタにせず、配列の要素数が明示された配列の参照渡しを行い、関数内で「要素数が何個あるのか判るように書いて」から、assertマクロで「範囲外チェックを行う」のが良いでしょう。
#include <assert.h>
void func(int a[5])
{
assert(5 < sizeof(a)/sizeof(a[0])); /*範囲外なら異常終了*/
assert(5 >= 0); /*範囲外なら異常終了*/
a[5] = 1;
}
int main(void)
{
int a[5];
func(a);
return 0;
}
回答ありがとうございます。
assertの場合だとプログラムが中断するため、
私の理想の動作と少し違います。
中断せず、例外として処理することで、
内部的に不正アクセスを対処したかったので…
説明不足で申し訳ありません。
しかし、記述方法はとても参考になりました。
ありがとうごうざいました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語 構造体
-
MFCのCArrayを使った二次元配列
-
C言語において、 配列要素をひ...
-
構造体のextern方法
-
define で 配列
-
[C++]const int と配列
-
小数点第200位近くまでの商...
-
C言語の2次元配列 容量が大き...
-
char型配列をint型に代入するには
-
C言語の配列のコピーについて
-
C#で構造体の配列を持った構造...
-
3次元配列の動的確保
-
C言語について質問です。
-
C言語の平均点の出し方
-
fclose()でセグメンテーション違反
-
ファイルのデータを構造体に代...
-
2番目の最大値を求める
-
C#で配列が空かを判定するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報