C ++ n00b学习指针,试图返回指向数组的指针

时间:2017-04-20 21:04:00

标签: c++ arrays pointers

有人可以解释这个C ++代码有什么问题吗? 我可以看到你不能用C ++返回一个数组(就像在其他语言中一样)所以我正在返回一个指针。我了解到将指针设置为“myArray”的地址是没有意义的 - 因为“myArray”已经是一个地址(第一项)

我预期的输出 1,2,3,4

在不同的(在线)编译器上我在这里得到了不同的奇怪结果,包括:

  • 1,4,-993994160,32767
  • 1,-1077229596,-1077229588,1075514957
  • 1,2,3,3(如此接近)

所以这是我狡猾的代码:

<uses-feature>

非常感谢您提供的任何帮助!

3 个答案:

答案 0 :(得分:3)

您正在返回一个指向函数的 local 变量的指针,该函数在函数返回时不再存在。

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动态创建数组。

答案 1 :(得分: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());
}

答案 2 :(得分: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);
}

当然适当地填写椭圆。