c - 将数组 char 转换为数组 Short 时的奇怪行为

标签 c arrays casting

我有2个数组:第一个是8个无符号字符,第二个是4个无符号短字符,对于某些算法兼容性问题,我需要将短数组与字符数组的值一起使用,这样做我'我正在做一个循环

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) ,然后我发现(在检查汇编代码时) char_array 在第二种情况的循环中访问它之前会递增;并且在第一种情况(正确的情况)中读取变量后进行增量。似乎没有比编译器实现问题更多的解释了......

关于c - 将数组 char 转换为数组 Short 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17060848/

相关文章:

C++ 对象和 C 风格转换问题

c - 为什么转换不同的指针类型会导致 TBAA(基于类型的别名分析)违规?

c - executable(hello) 未创建,已创建两个程序的目标文件

javascript - 根据数字数组计算五分位数/十分位数

arrays - 如何将 "merge"两个数组放在一起? (逐项连接字符串)

从c中的字符缓冲区中转换对象

C 十六进制常量类型

c - 使用模数循环 9-0 并打印

c - 打印类型定义

c# - 在 C# 中重用数组