2

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

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

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

==== 编辑:我应该补充一点,我只收到过来自 malloc() 的偶数(字对齐)地址,所以到目前为止一切都运行良好。尽管如此,如果我得到一个奇怪的地址,我的代码会导致一个陷阱(因为我确实执行了类似的操作((uint16_t *)foo)[3] = 20000;)。因此,我想确保 malloc() 始终返回偶数地址。

4

3 回答 3

2

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

于 2016-08-17T22:39:00.637 回答
1

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

于 2016-11-23T19:32:46.843 回答
0

Just avoid malloc. From MISRA/C 2004:

Rule 20.4 (required): Dynamic heap memory allocation shall not be used. [Unspecified 19; Undefined 91, 92; Implementation 69; Koenig 32] This precludes the use of the functions calloc, malloc, realloc and free. There is a whole range of unspecified, undefined and implementation-defined behaviour associated with dynamic memory allocation, as well as a number of other potential pitfalls. Dynamic heap memory allocation may lead to memory leaks, data inconsistency, memory exhaustion, non- deterministic behaviour. Note that some implementations may use dynamic heap memory allocation to implement other functions (for example functions in the library string.h). If this is the case then these functions shall also be avoided.

If you know that you won't need to store more than 100 integers, just declare an array with size of 128 elements (for example).

于 2016-08-20T21:28:14.960 回答