c++ - 写入 int 与 uint16_t 时的内存填充

标签 c++ c pointers

我一直在查看一些代码,我看到了一个有趣的事情:在某些时候有一行

pTable[i] = ((int *)val)[i]; // case 1

pTable 是一个 uint16_t 指针,val 是一个 void 指针;所以我想把它改为

pTable[i] = ((uint16_t *)val)[i]; // case 2

并发现输出中存在一些差异。所以我开始首次亮相,发现内存的排列方式有所不同。假设 void 指针中的数据类似于 val[0] = 0x1234val[1] = 0x5678

  • 在第一种情况(情况 1)中,内存转储显示addr 56781234
  • 在第二种情况(情况 2)中,内存转储显示 addr 00001234 00005678

代码很大,不是我的,我不能放在这里,但它是一个解析器(它从文件中读取值)。到达该 void 指针的内容可能是 intfloat 值(在我的例子中,它们是 int)。

我想这是关于解释指针数据的问题,但我自己无法解释,有人可以向我解释吗?谢谢

最佳答案

int 在您的系统上可能是 32 位,而 uint16_t 是 16 位。

这意味着在第一种情况下您将在 val[i] 地址处访问 32 位信息,在第二种情况下仅访问 16 位信息。

内存中的位置也会改变,因为[]运算符根据val<的类型转换为这个*(val + i)/。 换句话说, ((int *)val)[i];((uint16_t *)val)[i]; 不在同一地址,除非 i 为 0;

“i”乘以 sizeof(val[0]) 将确定 val 地址的偏移量。

关于c++ - 写入 int 与 uint16_t 时的内存填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48443268/

相关文章:

c - 为什么第二个printf打印0

c++ - 算法 - 关于序列中位数的许多查询

c++ - 执行 AVX 整数运算

c - tcc 不被识别为内部或外部命令、可操作程序或批处理文件

c - 关于 C 中 1 元素数组的 typedef

C - 指向结构体 "Segmentation fault (core dumped)"中的动态数组的指针

java - Java 端未找到我的 native 方法

c++ - 如何在程序内存中搜索images/png/jpeg/任何其他类型并显示它?

c++ - 在 Mac OS X Lion 上使用 OpenMP 编译失败(memcpy 和 SSE 内在函数)

c - 指针声明中的错误数据类型