c - 当我以 uLong 形式访问数组时会发生什么,该数组最初被声明为 unsigned short?

标签 c arrays types casting

我有一个由malloc() 分配的数组;初始化并声明如下:

unsigned short *array

现在,如果我确定数组足够大:

(unsigned long)array[0]++

是否适用于预期的数据长度?
它会导致未对齐的内存访问(这很容易在许多架构上引发异常)吗?是的,它会比多次访问原始类型的变量慢吗?

这样做等于:

for(int i=0;array[i]==0xFFFF || i==0;i++) { /// doing a uLong increment as per short members
    array[i]++
    if(i==(sizeof long)/2)
        break;
}

最佳答案

这不会造成问题,因为转换是在数据作为short 访问之后应用的。以下是将要发生的操作顺序:

  • array[2],访问一个short
  • array[2] 的值被转换为unsigned long
  • 在下一个序列点,array[2]+1 值存储在array[2]

这不会导致未分配的访问,因为没有指针转换。

EDIT :(响应问题的编辑)由于 malloc 保证返回一个数组,该数组与任何类型一起使用,您的示例 array[0] 保证工作,即使您将 pointer 转换为 unsigned long*,假设您有足够的数据空间.但是,不能同时使用 unsigned shortunsigned long 访问同一对象。

关于c - 当我以 uLong 形式访问数组时会发生什么,该数组最初被声明为 unsigned short?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24234884/

相关文章:

c - 使用函数和数组

java - 为什么我的数组不打印出我的输入?

postgresql - Java jdbc float 和 postgres 类型映射

C# 等效于 Swift typealias

java - 全局 float 组值不传递类

c++ - 幻影类型是否与原始类型具有相同的对齐方式?

c - 从txt文件读入数组

c - 使用 realloc() 会在传递特定内存值后导致段错误

C 通过读取系统调用在我的缓冲区中查找换行符

javascript - 为什么这是无限循环?