假设我有以下代码片段:
int8_t *a = 1;
int16_t *b = (int16_t*)(a + 1);
int32_t *c = (int32_t*)b + 2;
那么 a = 1,b = 2,c = 10。 (这里我也不确定,因为我将 printf() 与 %i 一起使用,并且收到了关于此的警告。)
我不太确定这是如何工作的。我有一些理论,但我更喜欢阅读一些相关文档。
有人可以给我一个关键词来搜索或向我解释这三种情况下的确切行为吗?由于缺少搜索词,我无法在 SO 或 google 上找到有关此事的信息。
当我输入时输出会改变
int16_t *a = 1;
int32_t *b = (int16_t*)(a + 1);
int64_t *c = (int32_t*)b + 2;
相反?
最佳答案
我认为你的整个程序是未定义的行为,因为我不确定将任意值放入指针变量或使用 %i
输出它们是否有效。
也就是说,我认为大多数环境都可以,所以我想我可以开始解释了。
如果a
是1
,它(未对齐)指向内存地址1
。
然后添加 1,使其指向 2
,并将结果转换为适合 b
。
之后,您烘焙 b
一个 uint32_t *
并添加 2,因此实际上您添加了 2*4
,从而得到 make b
指向 10 (0xA)
。
如果您执行上述更改,您的 a
会指向 1
(和 2
,因为它有 16 位),并添加 1
将使 b
指向 3
(和 4
)(那里不需要强制转换),并且 c
将指向 3+2*4 = 11。
关于转换并添加指向不同大小类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13089145/