malloc-运行时内存指针类型分配

时间:2019-05-26 02:50:33

标签: c++

当我需要代码在运行时确定其类型时,我不知道如何正确使用malloc。如何在运行时使用malloc的标头中声明一个可以使用两种不同结构之一的缓冲区?

struct rgb_16 {
    unsigned short r;
    unsigned short g;
    unsigned short b;
};

struct half_16 {
    half r;
    half g;
    half b;
};

(void*)buffer;

if(sample_format == 1) {
    buffer = (rgb_16*)malloc(width * height * sizeof(rgb_16));
}

if(sample_format == 3) {
    buffer = (half_16*)malloc(width * height * sizeof(half_16));
}

if(tiff.sample_format == 3) {
    // data is float. do not normalize
    for(int x = 0; x < rgba.size(); x++) {
        rgba[x].r = (half)tiff.buffer[x]
                        .r; // error: Subscript of pointer to incomplete type 'void'
        rgba[x].g = (half)tiff.buffer[x]
                        .g; // error: Subscript of pointer to incomplete type 'void'
        rgba[x].b = (half)tiff.buffer[x]
                        .b; // error: Subscript of pointer to incomplete type 'void'

        rgba[x].a = 1.0;
    }
}

我收到一条错误消息:
//error: Subscript of pointer to incomplete type 'void'

我希望通过使用void指针,而不关心最终将malloc用于缓冲区的类型。

是否可以在运行时用rgb_16half_16填充缓冲区?

第一次在此发布信息,所以请让我知道我是否应该以其他方式格式化我的信息。谢谢。

1 个答案:

答案 0 :(得分:2)

if( tiff.sample_format == 3) {之后,您需要类似half_16* h = (half_16*) buffer的东西。编译器无法知道buffer是什么类型,因此也不知道第x个条目要走多远。但是使用h[x]可以这样做,因为h的类型为half_16*