我在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
的位置时,我得到一个总线异常说未实现的RAM内存访问。我怀疑这是因为我试图写入0x00。
我在代码中做错了什么吗?
附加信息:
- 我已经分配了一个16字节的堆。
- 对于大小为2的内存请求,我得到相同的错误。 我正在使用MPLAB SIM调试器。
- MPLAB版本8.87.00.00.
- 使用XC32编译器构建。
我已经分配了一个16的堆
不足以支持16字节的堆空间分配。堆管理需要一定的空间,每个分配通常有8字节的对齐保证,以确保64位数据类型的对齐。
你应该分配远远超过需要的堆,当然超过16字节——为此你最好使用堆栈或静态分配。
通常你会想要分配所有可用的内存不用于其他目的(堆栈空间,静态,DMA池等)到堆,因为它将被闲置,否则(你可能会允许一点空间,以便在维护静态分配的小变化不需要你改变堆大小);但是您可以简单地通过将堆分配增加到1024字节来验证我的假设。如果您没有那么多可用的堆,那么您的系统可能根本不适合支持堆。
使堆大小>=32解决了这个问题,但我无法解释为什么。在某种程度上,这可能与它是一个32位的PIC有关。
如果有人能,我将感激不尽。
——编辑——
我有一些进一步的信息,每次我想为一个新的指针放置一个新的malloc调用,我必须增加堆32,即使我没有使用它的全部。此外,在地址中,这些指针至少以23分隔!位置,即使malloc请求是1到8之间的任何东西,然后当你想要更多的东西。当然,如果你不小心,一个指针进入另一个指针的范围是没有问题的