相关疑难解决方法(0)

什么是uintptr_t数据类型

什么是uintptr_t以及它可以用于什么?

c++ types pointers

233
推荐指数
5
解决办法
16万
查看次数

错误:从'void*'转换为'int'会失去精度

我有一个原型函数,void* myFcn(void* arg)用作pthread的起点.我需要将参数转换为int以供以后使用:

int x = (int)arg;
Run Code Online (Sandbox Code Playgroud)

编译器(GCC版本4.2.4)返回错误:

file.cpp:233: error: cast from 'void*' to 'int' loses precision
Run Code Online (Sandbox Code Playgroud)

投这个的正确方法是什么?

c++ casting void-pointers

59
推荐指数
8
解决办法
13万
查看次数

将一个int指针转换为char ptr,反之亦然

问题很简单.据我了解,GCC坚持认为字符将是字节对齐的,并且在32位环境中对齐4字节对齐.我也知道C99标准6.3.2.3,它表示在未对齐的指针类型之间进行转换会导致未定义的操作.C的其他标准对此有何评论?这里也有许多经验丰富的编码员 - 对此有任何看法将不胜感激.

int *iptr1, *iptr2;
char *cptr1, *cptr2;

iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;
Run Code Online (Sandbox Code Playgroud)

c types pointers casting c89

15
推荐指数
2
解决办法
2万
查看次数

再一次:严格的别名规则和char*

我读的越多,我就越困惑.

相关问题的最后一个问题与我的问题最接近,但是我对所有关于对象生命周期的问题感到困惑,尤其是 - 只读或不读.


直截了当.如我错了请纠正我.

这很好,gcc没有发出警告,我正试图" 通过" 读取类型T(uint32_t)char*:

uint32_t num = 0x01020304;
char* buff = reinterpret_cast< char* >( &num );
Run Code Online (Sandbox Code Playgroud)

但这是"坏"(也是一个警告),我正在尝试"反过来":

char buff[ 4 ] = { 0x1, 0x2, 0x3, 0x4 };
uint32_t num = *reinterpret_cast< uint32_t* >( buff );
Run Code Online (Sandbox Code Playgroud)

第二个如何与第一个不同,特别是当我们谈论重新排序指令(用于优化)时?另外,添加const不会以任何方式改变这种情况.

或者这只是一条直接规则,它明确指出:"这可以在一个方向完成,但在另一个方向不能完成"?我在标准中找不到任何相关内容(特别是在C++ 11标准中搜索过).

C和C++是否相同(因为我读了一条评论,暗示它与2种语言不同)?


我曾经union"解决"这个问题,但仍然看起来并非 100%正常,因为标准无法保证(这表明我只能依赖于最后一次修改的值union).

所以,经过大量阅读,我现在更加困惑.我想只是memcpy"好"的解决方案?


相关问题:


编辑
现实世界的情况:我有一个第三方库(http://www.fastcrypto.org/),它计算UMAC并返回值char[ 4 ].然后我需要将其转换为uint32_t.而且,顺便说一句,lib使用的东西((UINT32 …

c c++ strict-aliasing reinterpret-cast

13
推荐指数
1
解决办法
812
查看次数