C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

配列を返す関数をC++がサポートしないのはなぜですか


この次のプログラムについて考えてみましょう

#include <iostream>
using namespace std;
int* Array() {
   int a[100];
   a[0] = 7;
   a[1] = 6;
   a[2] = 4;
   a[3] = 3;
   return a;
}
int main() {
   int* p = Array();
   cout << p[0] << " " << p[1]<<" "<<p[2]<<" "<<p[3];
   return 0;
}

このプログラムでは、次のように警告が表示されます

出力

In function 'int* Array()':
warning: address of local variable 'a' returned [-Wreturn-local-addr]
int a[100];
を返しました

ローカル変数のアドレスを返しますが、関数呼び出しの終了後にローカル変数がメモリに存在しない可能性があるため、これは不可能です。そのため、C++は配列を返す関数をサポートしていません。


  1. GCCでのC++標準のサポート

    GCCは、公開されている複数のISO規格に対応する、C++のさまざまな方言をサポートしています。実装する標準は、-std=コマンドラインオプションを使用して選択できます。 C ++ 98 − GCCは、2003年に変更され、C++03およびその後のいくつかの欠陥レポートに名前が変更された1998C++標準を完全にサポートしています。 C ++ 11 − GCC 4.8.1は、以前はC++0xとして知られていた2011C++標準の最初の完全な実装でした。 C ++ 14 − GCCは、2014年に公開されたC++標準の最新リビジョンを完全にサポートしています。 C ++ 1

  2. 可変長配列がC++標準の一部ではないのはなぜですか?

    スタック上に潜在的に大きな配列を作成する必要がありますが、これは通常、使用可能なスペースがほとんどないため、適切ではありません。サイズが事前にわかっている場合は、静的配列を使用できます。また、事前にサイズがわからない場合は、安全でないコードを記述します。可変長配列は、型システムで大幅な変更が必要になるため、C++にネイティブに含めることはできません。 C ++の可変長配列の代替は、ベクトルであるC++STLで提供されます。 -のように使用できます 例 #include<iostream> #include<vector> using namespace std; i