【问题标题】:malloc not fail in Keil Cmalloc 在 Keil C 中不会失败
【发布时间】:2016-10-07 09:32:09
【问题描述】:

如何在 Keil C 中检查 malloc() 是否失败?

unsigned char xdata malloc_mempool [0x100];
void display()
{
    unsigned char xdata *ptr;
    int a;
    init_mempool (&malloc_mempool, sizeof(malloc_mempool));

    ptr = malloc(9000000);
    if(ptr != 0)
    {
        a = 7;
        free(ptr);
    } else {
        a = 9;
    }
}

http://www.keil.com/support/man/docs/c51/c51_malloc.htm 中所述 如果没有足够的内存来满足分配请求,malloc 将返回空指针。显然在 8051 中没有那么大的内存。但是 a 的结果总是 7。

【问题讨论】:

  • 9000000 甚至不适合 int。我不记得在这种情况下编译器应该做什么,但您可能希望将其更改为 int 在您的情况下是 16 位?
  • @glglgl, malloc() 接受unsigned int
  • 您的设备实际有多少 RAM?
  • @mingpepe 看malloc的源码。顺便说一句,在具有 512 字节 RAM 的系统上进行动态内存分配有意义吗?
  • "但是 a 的结果总是 7。" --> 也许因为代码对a 没有任何作用,所以a 被优化了。 OP 断言a 是 7 是基于以未说明的方法读取a。编写打印a 值的真实代码。以及ptr 的值。

标签: c keil 8051


【解决方案1】:

Understanding The Memory Organization Of 8051 Microcontroller 开始,8051 的内存最大为 64KB。

因此它将使用 2 个字节作为指针。十进制的9000000是十六进制的0x895440,也就是3个字节。

很可能 malloc() 函数会忽略它不能使用的位,所以实际上你正在做的调用是

ptr = malloc(0x5440);

这是

ptr = malloc(21568);

【讨论】:

  • 可能是正确的,但这仍然不能解释为什么它不适用于malloc(9000)(请参阅 cmets)。
  • 呃,是的。问题是“a 的结果总是 7”。这意味着 malloc 成功分配了内存。如果您使用 malloc(9000) 得到与预期相同的结果。
  • @buffjape 有了一个 256 字节的 malloc 池,我根本没想到会这样。
  • OP 不应该指望其他人从某些 cmets 收集丢失的部分,而是 post a minimal, complete, and verifiable example
猜你喜欢
  • 2023-04-04
  • 2014-05-01
  • 2020-11-10
  • 2011-02-28
  • 2018-01-12
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多