use*_*285 2 c++ memory nullptr c++11
假设我有两个指针:
char* p1 = nullptr;
char* p2 = std::malloc( 4 );
std::size_t offset = p2 - p1;
Run Code Online (Sandbox Code Playgroud)
以这种方式获得抵消是否安全?到目前为止它在我的电脑上工作正常.但我想知道偏移是否可以超过size_t的最大数量,以致此方法失败?
这是未定义的行为,来自草案C++标准部分5.7 Additive运算符:
当减去指向同一数组对象的元素的两个指针时,结果是两个数组元素的下标的差异.结果的类型是实现定义的有符号整数类型; 此类型应与标题(18.2)中定义为std :: ptrdiff_t的类型相同.[...]除非两个指针指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为是未定义的.82
另外作为参考提及,结果std::ptrdiff_t不是size_t.
另一方面,您可以加上或减去0第7段所述的价值:
如果将值0添加到指针值或从指针值中减去,则结果将等于原始指针值.如果两个指针指向同一个对象,或者两个指针都指向同一个数组的末尾或两者都为空,并且减去了两个指针,则结果将比较等于转换为类型std :: ptrdiff_t的值0.
如果要将指针转换为整数值,则应使用intptr_t或uinitptr_t:
Run Code Online (Sandbox Code Playgroud)intptr_t integer type capable of holding a pointer uintptr_t unsigned integer type capable of holding a pointer
例如:
uintptr_t ip = reinterpret_cast<uintptr_t>( p2 ) ;
Run Code Online (Sandbox Code Playgroud)