トップページ > コンテンツ > プログラミング入門 > C言語入門 > C言語の基本まとめ > 配列をreturnするときの注意

例えば、
#include <stdio.h>
char *string();
int main(void)
{
        char *p;
        p = string();
        return 0;
}
char *string()
{
        char str[] ={a,b,c,d,e};
        return str;
}
のようなプログラムを書いた場合、strはstring関数内のローカル変数なためメモリ上から消えてしまう。
そのため、返す値は意味の無いデータとなってしまう。
このようなことが起こらないように返す値はグローバル変数にするか、static変数のアドレスを返すようにする。

とまぁ以上のように書いたが、CやC++では配列や構造体を返すことを推奨しない人は多い。
というのも基本的にはポインタで先頭のアドレスだけを返して後は管理者に一任するので、
予期せぬエラーが増えることやメモリ確保や解放の観点上複雑になりやすいからだ。


表題は配列をreturnと書いているが、厳密にはポインタを返しているだけである。
配列をsetするような関数を用意するのも1つの手段である。
(注)以下コードは簡略化で初期化していないので、
値の格納されてない所にアクセスするとエラーが発生する。
void func(int *a) {
   a[5] = 10;
} 
int main() {
   int a[10];
   func(a);
   std::cout << a[5] << std::endl;
}
とすると、a[5]の値が表示される。

最終更新:2011年04月02日 16:33