C语言 Microchip XC32编译器,malloc调用返回0,写入指针抛出未实现的RAM



我在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之间的任何东西,然后当你想要更多的东西。当然,如果你不小心,一个指针进入另一个指针的范围是没有问题的

最新更新