相关疑难解决方法(0)

`char`总是总是有8位吗?

我一直认为:

  1. a char由一个字节表示,
  2. 一个字节总是可以指望有8位,
  3. sizeof (char)总是1,
  4. 并且我可以分配的最大理论内存量(以chars 计)是RAM的字节数(+交换空间).

但是现在我已经阅读了维基百科条目,我不再那么肯定了.

我的假设中有哪一个是错的?哪一个是危险的?

c memory

41
推荐指数
4
解决办法
1万
查看次数

将字节偏移量添加到任何指针的便携且安全的方法

我很擅长使用C++,并且没有掌握语言的所有复杂性和细微之处.

在C++ 11中向任何类型的指针添加任意字节偏移量的最便携,正确和安全的方法是什么?

SomeType* ptr;
int offset = 12345 /* bytes */;
ptr = ptr + offset;             // <--
Run Code Online (Sandbox Code Playgroud)

我在Stack Overflow和Google上找到了很多答案,但他们都提出了不同的建议.我遇到的一些变种:

  1. 演员char *:

    ptr = (SomeType*)(((char*)ptr) + offset);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 演员unsigned int:

    ptr = (SomeType*)((unsigned int)ptr) + offset);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 演员size_t:

    ptr = (SomeType*)((size_t)ptr) + offset);
    
    Run Code Online (Sandbox Code Playgroud)
  4. "大小size_t并且ptrdiff_t总是与指针的大小一致.因此,这些类型应该用作大型数组的索引,用于存储指针和指针算术." - 关于 CodeProject上的size_t和ptrdiff_t

    ptr = (SomeType*)((size_t)ptr + (ptrdiff_t)offset);
    
    Run Code Online (Sandbox Code Playgroud)
  5. 或者像之前的那样,但是intptr_t代替的size_t是签名而不是签名的:

    ptr = (SomeType*)((intptr_t)ptr + (ptrdiff_t)offset);
    
    Run Code Online (Sandbox Code Playgroud)
  6. 仅转换为intptr_t,因为offset已经是有符号整数而intptr_t …

c++ pointers pointer-arithmetic c++11

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

标签 统计

c ×1

c++ ×1

c++11 ×1

memory ×1

pointer-arithmetic ×1

pointers ×1