【发布时间】:2013-06-12 08:22:46
【问题描述】:
我有 2 个数组:第一个是 8 个 unsigned char,第二个是 4 个 unsigned short,对于某些算法兼容性问题,我需要将短数组与 char 数组的值一起使用,这样做我我在做一个循环
j = 0;
for(i=0; i<8; i+=2)
{
short_array[j] = *(unsigned short*) (char_array + i);
j++;
}
这里一切正常,但在之前的一些尝试中,我尝试了以下方法(这显然不是正确的答案)
j = 0;
for(i=0; i<8; i+=2)
{
short_array[j] = (unsigned short*) *(&(char_array + i));
j++;
}
问题:
假设以下char_array = {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88}
当我做第一个 short_array = {0x1122, 0x3344, 0x5566, 0x7788}
但是当我做第二个时,short_array = {0x3344, 0x5566, 0x7788, ???}(其中 ??? 是未定义的,因为它是内存中的一个值并且可能会改变)。
你能解释一下为什么会这样吗?
PS:我的编译器套件是 Keil 的 C251
【问题讨论】:
-
&(char_array + i)甚至不应该编译。 -
@H2CO3 我非常同意这一点!这就是为什么我再次感到惊讶的原因,这是否可以在 gcc(或任何 C99)上编译?
-
不,它没有。 OS X 上的
clang告诉我quirk.c:14:44: error: address expression must be an lvalue or a function designator。 -
所以我认为这是一个编译器问题(感谢您对其进行测试),我将查看汇编代码以了解这一点。如果 Keil 人读到这里,请考虑制作一个高效的编译器...
-
memcpy(short_array, char_array, sizeof short_array);可能会起作用,具体取决于字节序。