类型转换无效指针指向无符号短整型

Typecasting void pointer to unsigned short

本文关键字:无符号 短整型 无效 指针 类型转换      更新时间:2023-10-16

嗨,我正在尝试使用代码,http://blog.firetree.net/2006/08/23/nasa-srtm-elevation-data/,没有成功,经过多次追逐,我发现它在哪里失败了,但不知道如何修复它,请帮忙,这已经做了大约 6 个小时。这是失败的行。数据是指向内存映射文件的空指针。

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

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

我认为

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

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

对于您的情况,您可以先将 void 指针强制转换为无符号字符*,然后将 2 个无符号字符转换为无符号短字符:

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;
}

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

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