3

假设我有以下代码片段:

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;

反而?

4

2 回答 2

3

我认为您的整个程序是未定义的行为,因为我不确定将任意值放入指针变量或使用%i.

也就是说,我认为大多数环境都可以,所以我想我可以开始解释了。

如果a1,它(未对齐)指向内存地址1。然后添加 1,使其指向2,并将结果转换为适合b

之后,您烘烤bauint32_t *并添加 2,因此您可以有效地添加2*4并因此b得到10 (0xA).

如果您进行上述更改,您a指向1(and 2,因为它有 16 位),添加1b指向3(and 4)(那里不需要演员表),c并将指向 3+2*4 = 11。

于 2012-10-26T14:53:52.930 回答
2

而不是像这样的特定问题,您可能应该尝试更多地了解语言本身(指针,取消引用等)http://www.cplusplus.com/doc/tutorial/pointers/

给指针赋值就像说这个指针代表地址(值)处的内存。

int8_t * a = 1; // a is memory at address 1
int16_t *b = (int16_t*)(a + 1); // b is memory at address (a + 1)... 2
int32_t *c = (int32_t*)b + 2; // c is memory at address 2 + (2 * sizeof(int32_t))... 10
于 2012-10-26T14:57:43.020 回答