C99/C++11标准是否保证sizeof(size_t) == sizeof(void*)
始终成立?
size_t f(void* p)
{
return (size_t)(p); // Is it safe?
}
void* f(size_t n)
{
return (void*)(n); // Is it safe?
}
C99/C++11标准是否保证sizeof(size_t) == sizeof(void*)
始终成立?
size_t f(void* p)
{
return (size_t)(p); // Is it safe?
}
void* f(size_t n)
{
return (void*)(n); // Is it safe?
}
intptr_t
或 uintptr_t
将指针安全地存储在整数中。size_t
将足够。然而,指针有 "段" 和 "偏移量" 部分,因此它必须比16位大才能引用不同的段。intptr_t
和uintptr_t
是可选类型,可能存在某些架构,没有足够大的整数类型来包含void
指针。 - Bryan Oliviersize_t
也无济于事。因此,我认为这些类型的存在可以用作指示器,以确定是否可能进行这样的转换。 - Angew is no longer proud of SOsize_t
真的是用于对象大小的。大多数现代编译器都支持 intptr_t
和 uintptr_t
,否则在 C 中无法实现 %p
格式说明符。 - Bryan Oliviersize_t
被定义为一种无符号整数类型,能够存储程序在理论上可以创建的最大对象的大小。 - Angew is no longer proud of SO
size_t
和void*
是两种不相关的类型。为什么它们应该相等呢?我知道size_t
试图存储最大的数字,而void*
作为指针则试图访问最大的内存地址空间。但这并不意味着它们必须相等。 - masoudsize_t
vs.intptr_t
- masoudsize_t
是可寻址的最大连续字节数(数组的最大长度)。如果您使用分段内存或类似x86-64(64位指针;其中只有48位可用,并且地址空间中间有一个巨大的空洞),则这可以远低于整个地址空间。 - Andon M. Coleman