2017-04-20 20 views
1

誰にもこのC++コードの何が問題なのか教えてください。 C++で配列を返すことはできません(他の言語のように)ので、ポインタを返しています。私は、「MyArrayという」のアドレスへのポインタを設定するにはポイントがありませんことを学んだ - 「myarrayのは」既にアドレス(最初の項目)C++ n00b学習ポインター、配列へのポインターを返そうとしています

あるので、私は期待出力が1,2,3,4

ました、

  • 1、4、-993994160、32767
  • 1、-1077229596、-1077229588、1075514957
  • 1:別の(オンライン)コンパイラの

    は、私には、ここでは異なる奇妙な結果を得ています2,3,3(とても近い)

ので、ここで私の危険なコードです:

#include <iostream> 

using namespace std; 

int* getArray(){ 
    int myArray[] = {1,2,3,4}; 
    int* pointerToArray = myArray; 
    return pointerToArray; 
} 

void printArray(int inputArr[], int length) { 
    for (int i = 0; i < length; i++) { 
     cout << inputArr[i] << ", "; 
    } 
} 

int main() 
{ 
    printArray(getArray(),4); 
    return 0; 
} 

あなたが提供できるすべてのヘルプは非常に高く評価されては!

+0

この場合、C配列の代わりに 'std :: array'または' std :: vector'を使用してください。 – Jarod42

+0

そして、ローカル変数の参照を返すことはできません。 – Jarod42

+0

ローカル変数へのポインタを返しません。また、 'std :: vector'や' std :: array'を使う方法も学んでください。返された関数内の変数へのポインタを返すので、あなたは奇妙な結果を得ています。コンパイラがあなたに与えてくれるようなものが何であれ、あなたは今、何をしているのですか? – PaulMcKenzie

答えて

3

関数のローカル変数へのポインタを返します。このポインタは、関数が返っても存在しなくなります。

int* getArray(){ 
    int myArray[] = {1,2,3,4}; 
    int* pointerToArray = myArray; 
    return pointerToArray; 
} 

myArrayときgetArray()戻っ効果的に消えます。

それは常に存在を意味する変数静的持続期間を与える(ただし、関数の各呼び出しの代わりに、インスタンスの変数の唯一のインスタンスがあります)、これは動作します:

int* getArray(){ 
    static int myArray[] = {1,2,3,4}; 
    int* pointerToArray = myArray; 
    return pointerToArray; 
} 

newを使用して動的に配列を作成することを含む、他の多くのソリューションがあります。

2

std::arrayで、あなたが行うことがあります。

#include <iostream> 
#include <array> 


std::array<int, 4> getArray(){ 
    return {{1,2,3,4}}; 
} 

template <std::size_t N>  
void printArray(const std::array<int, N>& a) { 
    for (int e : a) { 
     std::cout << e << ", "; 
    } 
} 

int main() 
{ 
    printArray(getArray()); 
} 
0

あなたは1のため、スコープの問題を持っています。 myArraygetArrayに静的に宣言されていますので、すぐにgetArrayが返されると、そのメモリは他の人が自由に使用/上書きできます。

あなたがC配列を使用する場合:

#include <alloc.h> 

... 

int *getArray() 
{ 
    int *myArray = (int *)malloc(4 * sizeof(int)); 
    myArray[0] = 1; 
    ... 
    myArray[3] = 4; 
    return myArray; 
} 

int printArray(int *array, uint length) { 
    ... 
    free(array); 
} 

もちろん、適切に楕円の記入を。

関連する問題