2017-04-20 153 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); 
} 

在椭圆适当填充的,当然。