让我们说:
int main()
{
int32_t* value = (uint32_t*)malloc(sizeof(uint32_t));
uint32_t array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
*value = *(uint32_t*)((char*)array + 8);
printf("Value is: %d\n", *value);
return 0;
}
在这种情况下,该值为3。 为什么会这样呢? 如果我们将uint32_t转换为char,是否表示uint32_t中一个char为4字节,因此
array[9] = {0, 4, !!8!!, 12, 16, 20, 24, 28, 32};
有人可以解释吗?
答案 0 :(得分:2)
初始化数组时,每个初始化程序都会设置数组中的一个元素,而不管每个元素占用多少字节。
您的计算机可能正在使用低端字节序。这意味着array
在内存中看起来像这样:
-----------------------------------------------------------------
| 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | ...
-----------------------------------------------------------------
| [0] | [1] | [2] | [3] | ...
uint32_t
类型的每个值长4个字节,最低有效字节在前。
执行(char*)array
时,将array
(转换为指针)转换为char *
,因此,char *
上的任何指针算术都会将地址的大小增加char
,即1。
所以(char*)array + 8
指向此处:
(char*)array + 8 ------------------
v
-----------------------------------------------------------------
| 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | ...
-----------------------------------------------------------------
| [0] | [1] | [2] | [3] | ...
然后将该指针转换为uint32_t *
并取消引用,因此它读取值3。
答案 1 :(得分:1)