函数参数中的二维数组指针

3
这是目前为止对我有效的C++代码:
Main.cpp:
unsigned __int16** image_data; 
image_data = Grabber->get_image_data(1);

interface.cpp:

unsigned __int16** Grabber::get_image_data(int image_num) {
    unsigned __int16 **pixel_values = 0;
    pixel_values = new unsigned __int16*[height];
    for (int h = 0; h < height; h++) {
        pixel_values[h] = new unsigned __int16[width];
        for  (int w = 0; w < width; w++) {
            pixel_values[h][w] = ...;
        }
    }
    return pixel_values;
}

现在我想将数组作为指针传递给函数。我尝试了以下代码,但它不再起作用。

Main.cpp:

unsigned __int16** image_data;
Grabber->get_image_data(1, &image_data);

Interface.cpp:

int Grabber::get_image_data(int image_num, unsigned __int16*** image_data) {
    *image_data = new unsigned __int16*[height];
    for (int h = 0; h < height; h++) {
        *image_data[h] = new unsigned __int16[width];
        for  (int w = 0; w < width; w++) {
            *image_data[h][w] = ...;
        }
    }
    return 0;
}

我有没有犯任何推理错误?


#define 对我不起作用,你是否收到了编译器错误? - Andrzej Budzanowski
抱歉,没有编译器错误。 - recoN_90
我已经删除了点号;如果它们包含重要的代码,您应该将它们包括在内。如果不是,那没关系,您可以将它们省略掉。 - Bartek Banachewicz
1
不应该这样存储图像数据;更容易和更好的方法是使用平坦缓冲区(即__int16*),并手动计算索引。更好的方法是使用std::vector<int16_t>,它利用标准typedef并自动管理其内存。 - Bartek Banachewicz
更好的解决方案是通过引用传递。 - M.M
1个回答

6

*image_data[h] 意味着 *(image_data[h]) (也就是说,image_data[h][0]),而不是 (*image_data)[h](或者 image_data[0][h])。
后者才是你想要的。

如果引入一个局部变量,更容易正确地理解:

int ..::get_image_data(int image_num, unsigned __int16*** image_data) {
    ...
    unsigned __int16** data = new unsigned __int16*[height];
    *image_data = data;
    for (int h = 0; h < height; h++) {
        data[h] = new unsigned __int16[width];
        for  (int w = 0; w < width; w++) {
            data[h][w] = ...;
        }
    }
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接