首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微芯片XC32编译器,malloc调用返回0,写入指针抛出未实现的内存。

微芯片XC32编译器,malloc调用返回0,写入指针抛出未实现的内存。
EN

Stack Overflow用户
提问于 2013-01-10 11:49:03
回答 2查看 2.6K关注 0票数 0

我正在使用XC32编译器对MPLAB进行编码,并试图掌握使用动态内存的诀窍,因此我创建了一个基本示例程序:

代码语言:javascript
复制
#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。

我在密码里做错什么了吗?

其他信息:

  • 我已经分配了一个16字节的堆。
  • 对于大小为2的内存请求,我也会得到相同的错误。
  • 我正在使用MPLAB调试器。
  • MPLAB版本8.87.00.00。
  • 使用XC32编译器进行构建。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-10 13:51:00

我已经分配了一个16堆

这不足以支持16字节的分配。堆管理需要一定的空间,每个分配都保证对齐通常为8个字节,以确保64位数据类型对齐。

您应该分配比必要的堆多得多的堆,当然超过16个字节--因此您可以使用堆栈或静态分配。

通常,您希望分配所有未用于其他用途的可用内存(堆栈空间、静态内存、DMA池等)。对于堆,否则它将被使用(您可能会留出一点空间,以便在维护过程中,对静态分配的小更改不需要您更改堆大小);但是您可以简单地测试我的假设,例如将堆分配增加到1024字节。如果您没有那么多可用资源,那么您的系统实际上根本不适合支持堆。

票数 3
EN

Stack Overflow用户

发布于 2013-01-10 13:07:02

使堆大小为>=32解决了这个问题,但我无法解释原因。它可能与某种程度上的32位图片联系在一起。

如果有人可以的话,我会心存感激。

-编辑

我有一些进一步的信息,每次我想要一个新的malloc调用一个新的指针,我必须增加堆32,即使我没有全部使用它。此外,在地址中,这些指针被最小值23分隔!位置--即使malloc请求是介于1到8之间的任何东西,那么当你想要更多的东西的时候。但是,当然,如果您不小心,一个指针进入另一个指针的范围,没有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14257256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档