2017-04-20 90 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

在這種情況下,使用'std :: array'或'std :: vector'來代替C數組。 – 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

你有一個範圍的問題,其中之一。 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); 
} 

在橢圓適當填充的,當然。