C++ 类型转换无效指针指向无符号短字符

C++ 类型转换无效指针指向无符号短字符,c++,C++,嗨,我正在尝试使用来自的代码,但没有成功,经过多次的追踪,我发现了它失败的地方,但不知道如何修复它,请帮助,这已经让我头痛了大约6个小时。 这是失败的路线。数据是指向内存映射文件的空指针 unsigned short datum=((unsigned short*)data)[i]; 我在OpenSuse上使用gcc编译器。我使用的是64位系统。 提前感谢。如果你说它在那一点上崩溃了,那么我会想象你在数组之外阅读。但是,至少可以说,将指向无符号short的指针存储为无符号short是有趣的,这

嗨,我正在尝试使用来自的代码,但没有成功,经过多次的追踪,我发现了它失败的地方,但不知道如何修复它,请帮助,这已经让我头痛了大约6个小时。 这是失败的路线。数据是指向内存映射文件的空指针

unsigned short datum=((unsigned short*)data)[i];
我在OpenSuse上使用gcc编译器。我使用的是64位系统。
提前感谢。

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

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

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

对于你的情况, 您可以先将void指针强制转换为unsigned char*,然后将2个unsigned char转换为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;
}
无符号字符a=((无符号字符*)数据)[i];
无符号字符b=((无符号字符*)数据)[i+1];
if(平台是小的){

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

实际上,您并不是将数据强制转换到
无符号short
而是转换到
unsigned short*
无符号short
是通过索引来获得的。除了需要更准确的错误描述:什么是
i
,以及
数据的可访问内存有多长,我以静默方式运行它,但从调用它的函数中没有得到任何输出。使用调试器,它会到达这一点我假设崩溃是因为它跳出了函数而没有响应。@ Woke1:如果它跳出了函数,那么它就没有崩溃。Wooek1:从根本上说,这里没有足够的信息来回答你的问题。你应该考虑创建一个10行,它能够重新创建这个问题,然后发布它。