类型化无效指针指向unsigned short

时间:2012-04-18 23:44:10

标签: c++

您好我正在尝试使用来自http://blog.firetree.net/2006/08/23/nasa-srtm-elevation-data/的代码,但没有成功,经过多次追逐我发现它失败了,但不知道如何解决它,请帮助,这已经低头大约6个小时。 这是失败的一条线。 data是指向内存映射文件的void指针。

unsigned short datum=((unsigned short*)data)[i];

我使用gcc编译器在OpenSuse上。我是64位系统。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

我想这可能是由内存对齐引起的。 在某些平台上,指针值不能转换为某些类型。

例如,平台需要int *应该与4对齐,所以0x12345可以是void *或char *,但如果你将它分配给int *,则发生崩溃。

根据您的情况, 您可以先将void指针强制转换为unsigned char *,然后将2个无符号字符转换为unsigned short:

unsigned char a =((unsigned char*)data)[i];
unsigned char b =((unsigned char*)data)[i+1]; 
if (platform_is_little_endian()) {
    unsigned short datatum = (b << sizeof(unsigned char)) | a;
}
else {
    // platform is big endian
    unsigned short datatum = (a << sizeof(unsigned char)) | b;
}

答案 1 :(得分:1)

如果你说它在那时崩溃,那么我会想象你在数组之外阅读。但是,将指向无符号短整数的指针存储为无符号短指令至少是有趣的,甚至可以编译吗?

答案 2 :(得分:0)

通过Donald Tangs方法和程序在数组外读取的实现来解决。对于其他潜在用户,当找到num_rows num_cols的值时会出现问题,因为作者的平方根函数不是平方根。