【发布时间】:2018-01-25 12:47:10
【问题描述】:
我一直在看一些代码,我看到了一个有趣的事情:在某些时候有一行
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)。
我想这是关于解释指针数据的事情,但我自己无法解释,有人可以向我解释吗?谢谢
【问题讨论】:
-
如果
val指向int数组中的第一个元素,那么您的更改违反了严格的别名规则。 -
它不是分配指针,而是复制它们指向的值指针。而
uint16_t*演员表是val打破严格别名规则的错误类型。正如你所说的pTable是一个指针,所以pTable[i]是指向的值,即uint16_t -
这些都没有任何意义。
pTable是uint16_t指针... -
是的,这是一个很好的问题:为什么使用
uint16_t表示 int 或 float 值?!