如何返回一维未知大小的二维数组?

时间:2013-05-14 04:42:16

标签: c++ arrays types return-value

这与this question有关。我有一个函数void doConfig(mappings, int& numOfMappings),我不知道如何声明映射。它是一个二维数组,其元素是字符。第一个维度在运行时确定,并将在函数体中计算。第二个维度总是2.这是什么代码?我想象它是char** mappings或类似的东西。在C ++中,数组总是通过引用传递吗?所以我不需要使用&,即使我打算在函数返回时使用该值?

编辑:基本上我想退回 char (*mapping)[2] = new char[numOfMappings][2];

根据2to1mux的建议,我仍然无法让它发挥作用。数组似乎得到了正确的值,但是当doConfig()函数返回时出现了错误。

int main()
{
    int numOfMappings = 0;
    char **mappings;
    doConfig(mappings, numOfMappings);
    cout << "This is mappings" << mappings << endl;//this address is different than the one given in doConfig(), is that wrong?
    cout << "this is numOfMappings: " << numOfMappings << endl;
    cout << mappings[0][0] << "->" << mappings[0][1] << endl;//program crashes here
    //code removed
    return EXIT_SUCCESS;
}

void doConfig(char **mappings, int& numOfMappings)
{
    //code removed, numOfMappings calculated
    for(int j = 0; j < numOfMappings; j++)
    {
        getline(settingsFile, setting);
        mappings[j] = new char[2];
        mappings[j][0] = setting.at(0);
        mappings[j][1] = setting.at(2);
    }
    for(int j = 0; j < numOfMappings; j++)
        cout << mappings[j][0] << "->" << mappings[j][1] << endl;//everything is as expected so array created ok
    cout << "This is mappings" << mappings << endl;//different address than the one give in main
}

好的我现在已经开始工作了,但主要是来自于周围。有人可以解释一下他们如何知道何时使用*&的解决方案吗?

4 个答案:

答案 0 :(得分:2)

既然你标记了问题C ++而不是C,我想你可能想要一个合适的解决方案。

template<typename T>
using vectorOf2D = std::vector<std::array<T, 2>>;

vectorOf2D<char> getMappings() {
    return /* whatever you do to fill those */;
    // (most probably) using NRVO to ellide the copy
}

如果您担心访问可能会很复杂:

auto mappings = getMappings();

functionTakingAMapping(mappings[i]);
char element = mappings[0][1];

答案 1 :(得分:2)

(跟进我对相关问题的回答。)

直接(但相当复杂)的语法是

char (*create_mappings(size_t n))[2]
{
  // Allocate an char[n][2] array
  char (*mappings)[2] = new char[n][2];

  // Initailize `mappings[i][j]` in any way you want...

  return mappings;
}

但更好的想法是通过typedef

使其更具可读性
typedef char Char2[2];

Char2 *create_mappings(size_t n)
{
  // Allocate an char[n][2] array
  Char2 *mappings = new Char2[n];

  // Initailize `mappings[i][j]` in any way you want...

  return mappings;
}

答案 2 :(得分:1)

我会先回答你的问题:

  1. 正确,您无需在此使用&

  2. 术语按引用技术上不适用于传递数组,但对问题的简单回答是,您永远不会将数组的副本传递给函数。对类型数组的参数所做的任何更改都将应用于原始数组,而不是副本。

  3. 我建议传递一个双指针:

    void doConfig(char **mappings, int& numOfMappings)
    

    您将能够像访问二维数组一样访问映射成员。例如:

    mappings[2][3] = 'b';
    
  4. 编辑:这是基于您的澄清的新建议

    void doConfig(char** mappings, int& numOfMappings){
    
        /*Compute numOfMappings -- 
          this integer is passed by-reference, so it can be used outside function
          to figure out the size allocated within the function*/
    
        mappings = new char*[numOfMappings];
        for(int i=0; i < numOfMappings; i++){
            mappings[i] = new char[2];
        }
        /*Do whatever you need to do with mappings*/
    
        /*Return nothing because function is void -- since mappings is passed as
          pointer, changes are maintained after function ends*/
    
    }
    

答案 3 :(得分:0)

您可以返回指向2D数组的指针。

例如,

char **ptr;


return ptr;

在传递数组地址时,您不必使用&amp; operator,如果要传递2D数组的起始位置的地址而不是特定元素的地址。