从函数返回指向2D数组的指针 - C ++

时间:2017-06-05 23:04:14

标签: c++ arrays function pointers

所以我想要实现的是从函数返回指向2D数组的指针,以便可以在main()中访问它。我知道有一些C ++库像std::vector一样为你做这件事,但我正在努力避免动态内存分配,因为我正在使用嵌入式主板(STM32),因此我将坚持只是普通的指针和数组。 (由于某些原因我无法在KEIL uVision中使用std::array,这也是我被迫使用指针/数组的原因

另外,我理解返回指向函数内部定义的本地数组int arr[2][2]的指针并不是一个好主意,因为它在函数返回后将不再有效,这就是我创建{{1在一个类中声明它并在一个函数中定义它(充当一个全局变量)所以我认为这不应该是一个问题。你们有什么感想?但是,这样做会在标量初始化程序中出现错误"多余元素"

test_array
#include <iostream>
#include "file.hpp"

int main() {

  myClass class_object;

  class_object.value = class_object.foo();


}
//file.hpp

#include <stdio.h>

class myClass{

  int array[2][2];
  int (*foo())[2];
  int (*value)[2];

  int test_array[2][2];   //declaring here! 

}; 

2 个答案:

答案 0 :(得分:1)

当前的问题:

test_array[2][2]={ {10,20}, {30, 40} }; //defining here - ERROR!!

没有定义。 test_array中定义了myClass。这是尝试分配给test_array的单个元素,特别是[2][2]不存在的元素。特别冒犯编译器的不是越界访问,而是={ {10,20}, {30, 40} };试图将数组填充到单个数组元素中。编译器期望一个数字,因此四个数字肯定是过量的。

不幸的是,我不知道做你想做的事情的好方法。您可以使用初始化列表初始化数组,但不能从一个数组中分配。

所以

class myClass{
public:

    myClass();
    void foo();

    int test_array[2][2];   //declaring here!
};

// you can do this:
myClass::myClass(): test_array{ {10,20}, {30, 40} }
{

}

void myClass::foo()
{
    // but you can't do this:
    test_array = { {10,20}, {30, 40} };
}

根据您对test_array的处理方式,在构造函数中初始化可能对您有用。如果你必须在每次调用foo时重置数组,那么自动变量可能更适合你

void myClass::foo()
{
    int temp_array[2][2] = { {10,20}, {30, 40} };

    // use temp_array

    // maybe copy temp_array to test_array with good ol' memcpy here if you 
    // need to carry the state for some reason.
}

让房间里的大象沉默and gain access to std::array, give this a try.注意:我从来没有这样做过。对于我所知道的一切来说,这可能是一场彻头彻尾的灾难,所以请耐心等待。

答案 1 :(得分:0)

如果您真的想使用C-Array,请使用typedef来使用普通语法:

class myClass{
    public:
    using array2 = int[2][2];

    myClass() {
        test_array[0][0] = 0;
        test_array[0][1] = 1;
        test_array[1][0] = 2;
        test_array[1][1] = 3;
    }

    const array2& getArray() const { return test_array; }
    array2& getArray() { return test_array; }

private:
    array2 test_array;
};