我在 MPLAB 上编码,使用 XC32 编译器,并试图掌握使用动态内存的窍门,所以我创建了一个基本示例程序:
#include <stdlib.h>
#include <plib.h>
char x;
char y;
char main(void)
{
Nop();
char *pLocation = (char *)malloc(16);
if(pLocation == 0x00)
{
return 0;
}
for(x = 0;x<=7;x++)
{
*pLocation = x;
pLocation++;
}
while(1)
{
Nop();
}
}
问题:
- 当指针到达
malloc
调用行时,pLocation
的值被强制设置为 0x00,这意味着它无法从堆中向我传递指针信息. - 当指针将
x
的值分配给指针pLocation
的位置时,我得到一个Bus Exception 说 未实现的 RAM 内存访问。我怀疑这是因为我试图写入 0x00。
我在代码中做错了什么吗?
附加信息:
- 我已经分配了一个 16 字节的堆。
- 对于大小为 2 的内存请求,我得到同样的错误。
- 我正在使用 MPLAB SIM 调试器。
- MPLAB 版本 8.87.00.00。
- 使用 XC32 编译器构建。
最佳答案
I have already assigned a heap of 16
堆空间不足以支持 16 字节的分配。堆管理需要一定量的空间,并且每次分配都将保证通常为 8 字节的对齐,以确保 64 位数据类型的对齐。
你应该分配比必要更多的堆,当然超过 16 字节 - 为此你也可以使用堆栈或静态分配。
通常你会想要将所有未用于其他目的(堆栈空间、静态、DMA 池等)的可用内存分配给堆,因为否则它将不会被使用(你可能允许一点空间,以便在维护小对静态分配的更改不需要您更改堆大小);但是您可以简单地通过将堆分配增加到 1024 字节来检验我的假设。如果您没有那么多可用资源,那么您的系统可能根本不适合支持堆。
关于c - Microchip XC32 编译器,malloc 调用返回 0,写入指针抛出未实现的 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14257256/