奇怪的不兼容指针类型错误

时间:2012-02-18 21:55:57

标签: c types

我有一段看似无辜的代码:

void generate_heightmap(float **terrain) {

}

int main(int argc, char **argv) {
    float terrain[1500][1500];

    generate_heightmap(terrain);

    return 0;
}

但是当我尝试编译它时,我得到了这些奇怪的错误,原因可能是什么?

test.c||In function ‘main’:|
test.c|8|warning: passing argument 1 of ‘generate_heightmap’ from incompatible pointer type [enabled by default]|
test.c|1|note: expected ‘float **’ but argument is of type ‘float (*)[1500]’|
||=== Build finished: 1 errors, 1 warnings ===|

我有GCC 4.6.1和Ubuntu 11.11 64位。

2 个答案:

答案 0 :(得分:5)

2D数组与双指针不兼容(考虑如何在内存中布置2D数组,以及如何将索引编入其中需要了解其中一个维度。)

这个精确的主题在C FAQ的Question 6.18处理。

答案 1 :(得分:3)

尝试这样的事情:

void generate_heightmap(float terrain[][1500]) 

这个主题还有一个C FAQ。基本上你可以将数组作为指针传递给函数,因为它们会衰减为指针。但它们不会递归衰减。

如果您认为terrain[2]的含义是有道理的。它意味着地形的第三个要素:获取地址:terrain_addr + 2 * element_size

所以很明显,你需要知道terrain[x]对象有多大。