gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:30:30 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com