我可以这样投指针吗?

标签 c pointers microcontroller 8-bit

代码:

unsigned char array_add[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

...

if ((*((uint32_t*)array_add)!=0)||(*((uint32_t*)array_add+1)!=0))
{
 ...
}

我想检查数组是否全为零。所以很自然地我想到了将数组的地址(也恰好是第一个成员的地址)转换为 unsigned int 32 类型,所以我只需要这样做两次,因为它是 64 位,8 字节大批。问题是,它已成功编译,但程序每次都会在此处崩溃。

我正在 8 位微 Controller cortex-M0 上运行我的程序。

我哪里错了?

最佳答案

理论上这可行,但实际上您没有考虑到一件事:对齐的内存访问。

如果 uint32_t 需要对齐内存访问(例如 4 字节),则将具有 1 字节对齐要求的 unsigned char 数组转换为 uint32_t * 生成指向未对齐的 uint32_t 数组的指针。

根据 documentation :

There is no support for unaligned accesses on the Cortex-M0 processor. Any attempt to perform an unaligned memory access operation results in a HardFault exception.

在实践中,这只是在某些情况下调用未定义行为的危险且脆弱的代码,正如 Olaf 所指出的并更好地解释了 here .

关于我可以这样投指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41156024/

相关文章:

c - % 的预期表达式错误

c - Main 端出现段错误,提供 GDB 输出

c++ - 处理客户端连接的最有效方式(套接字编程)

c++ - "Error reading character of string"为散列动态增长数组的问题 (C++)

c++ - memcpy 如何处理指向数组的指针?

c - 如何处理结构数组?

c - 保护应用程序免受错误的 Lua 脚本的影响

c - 微 Controller 的键盘扫描

c - pthread_join 后出现段错误(核心转储)

c - 为什么我们像这样在微 Controller 编程中寻址寄存器