如何将二维结构数组传递给函数

How to pass two-dimensional array of structures to function?

本文关键字:数组 结构 函数 二维      更新时间:2023-10-16

有一个二维数组结构,我正在传递一个数组指针给一个函数:

result.capabilities = (Capabilities **)malloc(sizeof(Capabilities *)*6);
for(int i=0;i<6;i++){
    result.capabilities[i] = (Capabilities *)malloc(sizeof(Capabilities)*8);
}
init_capabilities(&result.capabilities);

函数调用导致错误:

在solution.exe中0x003c10f9的未处理异常:0xC0000005:访问违反写入位置0xfdfdfdfd.

下面是我的函数:

void init_capabilities(Capabilities ***capabilities) {
    for(int i=0;i<6;i++){
        for(int j=0;j<8;j++){
            printf("%d %dn",i,j);
            capabilities[i][j]->room_capabilities = new RoomCapability[rooms_count];
        }
    }
}

我认为数组的尺寸是capabilities - 6x8。结果是1x6。为此头痛了一个小时。向您展示如何更改参数的类型或如何引用数组的元素,以便一切就绪?

您正在通过指针传递指针到指针到功能。这就是为什么你有三个星号而不是两个。

试试这个:

void init_capabilities(Capabilities ***capabilities) {
    for(int i=0;i<6;i++){
        for(int j=0;j<8;j++){
            printf("%d %dn",i,j);
            // Note: extra dereference:
            (*capabilities)[i][j].room_capabilities = new RoomCapability[rooms_count];
        }
    }
}

:

result.capabilities = (Capabilities **)malloc(sizeof(Capabilities *)*6);
for(int i=0;i<6;i++){
    result.capabilities[i] = (Capabilities *)malloc(sizeof(Capabilities)*8);
}
init_capabilities(result.capabilities); // Note NO address-of operator
// Note: two stars, not three
void init_capabilities(Capabilities **capabilities) {
    for(int i=0;i<6;i++){
        for(int j=0;j<8;j++){
            printf("%d %dn",i,j);
            capabilities[i][j].room_capabilities = new RoomCapability[rooms_count];
        }
    }
}

或者,因为你是用c++编码,而不是C:

// Assuming that result.capabilities and Capabilties::room_capabilities are declared
// vectors of the appropriate types ...
result.capabilities = std::vector<std::vector<Capabilities> >(std::vector<Capabilities>(8),6);
init_capabilities(result.capabilities);
void init_capabilities(std::vector<std::vector<Capabilities>& capabilities) {
    for(int i=0;i<capabilities.size();i++){
        for(int j=0;j<capabilties[i].size();j++){
            printf("%d %dn",i,j);
            capabilities[i][j].room_capabilities.resize(rooms_count);
        }
    }
}

声明

void init_capabilities(Capabilities ***capabilities)

void init_capabilities(Capabilities **capabilities)

和call by

init_capabilities(result.capabilities); 

你只需要传递指针到你的数组结构体,而不是指向数组结构体指针的指针。

Edit:正如其他人指出的,如果你要使用c++,你应该真正使用new,如:

result.capabilities = new (Capabilities *)[6];
for(int i=0;i<6;i++) {
  result.capabilities[i] = new Capabilities[8];
}
init_capabilities(result.capabilities);

void init_capabilities(Capabilities **capabilities) {
  for(int i=0;i<6;i++) {
    for(int j=0;j<8;j++) {
      capabilities[i][j].room_capabilities = new RoomCapability[rooms_count];
    }
  }
} 

不要忘记使用delete[]。更好的做法是,按照Rob的建议,使用预定义的c++容器来处理这类事情。但是如果你真的想使用不安全指针,我上面的代码应该可以帮你完成。

你这里有一大堆问题:

  1. 您为每个单独的Capability分配空间,然后创建一个新建一个,将分配的空间变为垃圾
  2. 你治疗功能作为一个二维数组,当它实际上是一个指针数组数组
  3. 你传递了整个数组的地址,但是没有在函数
  4. 中不需要遵守它

在你弄清楚你想做什么之前,如何去做就得等一等了。