我一直在查看一些代码,我看到了一个有趣的事情:在某些时候有一行
pTable[i] = ((int *)val)[i]; // case 1
pTable
是一个 uint16_t
指针,val 是一个 void
指针;所以我想把它改为
pTable[i] = ((uint16_t *)val)[i]; // case 2
并发现输出中存在一些差异。所以我开始首次亮相,发现内存的排列方式有所不同。假设 void 指针中的数据类似于 val[0] = 0x1234
和 val[1] = 0x5678
- 在第一种情况(情况 1)中,内存转储显示
addr 56781234
- 在第二种情况(情况 2)中,内存转储显示
addr 00001234 00005678
代码很大,不是我的,我不能放在这里,但它是一个解析器(它从文件中读取值)。到达该 void 指针的内容可能是 int
或 float
值(在我的例子中,它们是 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/