Microchip XC16下的malloc()是否保证生成字对齐地址?

时间:2016-08-17 22:29:29

标签: pic microchip xc16

如果对奇数地址的存储器进行16位访问,dsPic30 / 33和18E / F部件将产生存储器故障。使用malloc()分配堆内存时,返回地址是否保证是字对齐的? (即使是)

你会记得, malloc以字节为单位,而不是单词。

我可以找到的文档(16位语言工具库参考手册50001456J.pdf)在这个问题上是静音的。

==== 编辑:我应该补充一点,我只收到了malloc()中的偶数(字对齐)地址,所以到目前为止一切都运行良好。然而,如果我得到一个奇怪的地址,我的代码将导致陷阱(因为我执行((uint16_t *)foo)[3] = 20000;之类的事情)。因此,我想确保偶数地址总是由malloc()返回。

3 个答案:

答案 0 :(得分:2)

C标准要求malloc()必须返回满足任何内存的指针 实现对可能适合分配的任何对象强加的对齐要求。如果编译器以不管对齐的方式处理所有内存访问,则malloc()实现可以返回具有任意对齐的指针。事实上,许多实现将返回以2,4或8字节的倍数对齐的指针,即使所需的对齐不那么粗糙,因为它避免了必须处理小于该空间的自由空间区域,但除非一个实现明确承诺,不应该期望这种行为不会改变。

答案 1 :(得分:1)

Microchip已通过其支持团队确认XC16 malloc()和realloc()始终返回偶数地址。

答案 2 :(得分:0)

避免使用malloc。来自MISRA / C 2004:

  

规则20.4(必填):    不应使用动态堆内存分配。   [未说明19;未定义91,92;执行69; Koenig 32]   这排除了calloc,malloc,realloc和free函数的使用。   有一系列未指定的,未定义的和实现定义的行为相关联   动态内存分配,以及其他一些潜在的陷阱。动态堆   内存分配可能导致内存泄漏,数据不一致,内存耗尽,非   确定性行为。   请注意,某些实现可能使用动态堆内存分配来实现其他实现   函数(例如库string.h中的函数)。如果是这种情况那么这些功能   也应该避免。

如果您知道不需要存储超过100个整数,只需声明一个大小为128个元素的数组(例如)。