gpt4 book ai didi

arrays - 为什么在使用指针访问未对齐的 uint16 数组时抛出 "alignment exception"而在使用下标访问数组时不抛出?

转载 作者:行者123 更新时间:2023-12-02 00:49:11 25 4
gpt4 key购买 nike

我将使用以下代码来解释我的问题:

typedef struct __attribute__((packed))
{
uint8_t var;
uint16_t array[3];
}struct_t;

uint8_t frame[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD};

volatile struct_t *ptr = NULL;
volatile uint16_t *u16ptr = NULL;
volatile uint16_t a;
volatile uint16_t b;

//******************************************************************************************
int main(int argc, char** argv)
{
ptr = (struct_t*)frame;
u16ptr = ptr->array;

a = ptr->array[0]; // <---- NO Memory Access Exception here
b = *u16ptr; // <---- Memory Access Exception here!
}

在那段代码中,我强制 array是内存未对齐的内存访问异常。

所以我的问题是, 为什么在通过指针访问未对齐的 uint16 数组时抛出“对齐异常”,而不是在使用数组下标访问数组时抛出?

到目前为止,我发现的所有资源都没有解释为什么会出现这两条线 a = ptr->array[0];b = *u16ptr;正在访问完全相同的未对齐内存。

有人可以解释或指出正确的方向吗?

最佳答案

尝试从未对齐的地址读取 16 位值将在某些架构上陷入困境。尽管标准定义了 x[y] 的行为相当于 *((x)+(y)) ,这将导致数组被分解为一个指针,然后从该地址获取一个值(如果地址未对齐则捕获),clang 和 gcc 都处理 structOrUnion.memberArray[index]作为标识 structOrUnion 成员的一部分的左值,与分解 structOrUnion.memberArray 的表达式相反到一个指针,忘记指针来自哪里,然后索引它。

如果[]运算符直接在未对齐的数组上使用,该数组是“打包”结构的成员,或联合、clang 和 gcc 的任何 aarray 类型成员将执行访问相关存储所需的操作。然而,如果这样的数组被分解为一个指针,clang 和 gcc 都不会可靠地允许它用于访问其类型的对象。

关于arrays - 为什么在使用指针访问未对齐的 uint16 数组时抛出 "alignment exception"而在使用下标访问数组时不抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59076652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com