C++ 在编写跨平台代码时,使用char*而不是void*有什么缺陷吗?

C++ 在编写跨平台代码时,使用char*而不是void*有什么缺陷吗?,c++,pointers,cross-platform,C++,Pointers,Cross Platform,在使用char*编写跨平台代码进行内存访问时,是否存在任何陷阱 更新:例如,在将解引用字符*强制转换为特定类型(例如int)之前,我是否应该检查地址是否与该类型的大小对齐?某些体系结构会在未对齐访问时返回奇怪的结果吗 我正在开发一个播放内存分配器,以更好地了解如何调试内存问题。我开始相信char*更可取,因为它有能力进行指针运算,并在void*上取消引用它们,这是真的吗?以下假设在不同的通用平台上是否始终成立 sizeof(char) == 1 sizeof(char*) == sizeof(v

在使用char*编写跨平台代码进行内存访问时,是否存在任何陷阱

更新:例如,在将解引用字符*强制转换为特定类型(例如int)之前,我是否应该检查地址是否与该类型的大小对齐?某些体系结构会在未对齐访问时返回奇怪的结果吗

我正在开发一个播放内存分配器,以更好地了解如何调试内存问题。我开始相信char*更可取,因为它有能力进行指针运算,并在void*上取消引用它们,这是真的吗?以下假设在不同的通用平台上是否始终成立

sizeof(char) == 1
sizeof(char*) == sizeof(void*)
sizeof(char*) == sizeof(size_t)
sizeof(char)==1
肯定总是正确的

sizeof(char*)==sizeof(void*)
可能也总是正确的。C标准要求它们具有相同的表示形式,这至少强烈地暗示了相同的大小


sizeof(char*)==sizeof(size\u t)
绝对不能依赖——我知道有一些实现是错误的(虽然它们可能不完全符合标准,但这不是它们的问题之一).

除非你取消引用
char
实例,否则你必须将
char*
void*
都转换为它们所指向的任何类型。不知道是否“保证”,但根据我的经验,前两个应该是安全的。最后一个…?。谢谢你,杰瑞。您是否知道一种类型的大小始终与指针大小相同(指针类型除外:)?例如,在32位构建中它应该是32位,在64位构建中它应该是64位。我的印象是大小是这样一种类型。@UberMongoose:首先,请注意,甚至没有要求指针的大小都相同。通常是这样,但这不是必需的。在大多数典型情况下,
size\u t
也将是相同的,但同样不能保证(我知道至少有几个例外)。MS(例如)定义了一些类型,如INT_PTR(一个与指针大小相同的整数),但这远远不是通用的。也许你能做的最好的事情就是在配置头中使用typedef,这样你就可以在到达需要修改的平台时进行修改。intptr\t?“以下类型指定了一个带符号的整数类型,其属性是任何指向void的有效指针都可以转换为该类型,然后再转换回指向void的指针,结果将与原始指针“@rici:Ah,仅此而已。”。非常好的建议(我以前没有注意到)。理论上,intptr_Èt是“可选的”,但我还没有遇到它的缺失。