我正在使用XC32编译器对MPLAB进行编码,并试图掌握使用动态内存的诀窍,因此我创建了一个基本示例程序:
#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的位置时,就会得到一个总线异常,表示未实现的内存访问。我怀疑这是因为我试图写信给0x00。我在密码里做错什么了吗?
其他信息:
发布于 2013-01-10 13:51:00
我已经分配了一个16堆
这不足以支持16字节的分配。堆管理需要一定的空间,每个分配都保证对齐通常为8个字节,以确保64位数据类型对齐。
您应该分配比必要的堆多得多的堆,当然超过16个字节--因此您可以使用堆栈或静态分配。
通常,您希望分配所有未用于其他用途的可用内存(堆栈空间、静态内存、DMA池等)。对于堆,否则它将被使用(您可能会留出一点空间,以便在维护过程中,对静态分配的小更改不需要您更改堆大小);但是您可以简单地测试我的假设,例如将堆分配增加到1024字节。如果您没有那么多可用资源,那么您的系统实际上根本不适合支持堆。
发布于 2013-01-10 13:07:02
使堆大小为>=32解决了这个问题,但我无法解释原因。它可能与某种程度上的32位图片联系在一起。
如果有人可以的话,我会心存感激。
-编辑
我有一些进一步的信息,每次我想要一个新的malloc调用一个新的指针,我必须增加堆32,即使我没有全部使用它。此外,在地址中,这些指针被最小值23分隔!位置--即使malloc请求是介于1到8之间的任何东西,那么当你想要更多的东西的时候。但是,当然,如果您不小心,一个指针进入另一个指针的范围,没有问题。
https://stackoverflow.com/questions/14257256
复制相似问题