我有一个由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 short
和 unsigned long
访问同一对象。
关于c - 当我以 uLong 形式访问数组时会发生什么,该数组最初被声明为 unsigned short?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24234884/