我一直认为:
char由一个字节表示,sizeof (char)总是1,chars 计)是RAM的字节数(+交换空间).但是现在我已经阅读了维基百科条目,我不再那么肯定了.
我的假设中有哪一个是错的?哪一个是危险的?
我很擅长使用C++,并且没有掌握语言的所有复杂性和细微之处.
在C++ 11中向任何类型的指针添加任意字节偏移量的最便携,正确和安全的方法是什么?
SomeType* ptr;
int offset = 12345 /* bytes */;
ptr = ptr + offset; // <--
Run Code Online (Sandbox Code Playgroud)
我在Stack Overflow和Google上找到了很多答案,但他们都提出了不同的建议.我遇到的一些变种:
ptr = (SomeType*)(((char*)ptr) + offset);
Run Code Online (Sandbox Code Playgroud)演员unsigned int:
ptr = (SomeType*)((unsigned int)ptr) + offset);
Run Code Online (Sandbox Code Playgroud)ptr = (SomeType*)((size_t)ptr) + offset);
Run Code Online (Sandbox Code Playgroud)"大小size_t并且ptrdiff_t总是与指针的大小一致.因此,这些类型应该用作大型数组的索引,用于存储指针和指针算术." - 关于 CodeProject上的size_t和ptrdiff_t
ptr = (SomeType*)((size_t)ptr + (ptrdiff_t)offset);
Run Code Online (Sandbox Code Playgroud)或者像之前的那样,但是intptr_t代替的size_t是签名而不是签名的:
ptr = (SomeType*)((intptr_t)ptr + (ptrdiff_t)offset);
Run Code Online (Sandbox Code Playgroud)仅转换为intptr_t,因为offset已经是有符号整数而intptr_t …