【问题标题】:Didn't allocate memory by using malloc没有使用 malloc 分配内存
【发布时间】:2009-07-01 05:13:21
【问题描述】:

我在分配内存时遇到了 malloc 问题:

ByteArr = (BYTE *)malloc(sizeof(SHORT) * 20); 

我遇到了类似的错误

"CXX0030: Error: expression cannot be evaluated"

但是如果我使用 428 或 1024 而不是 20 而不是分配内存。你能告诉我问题出在哪里...谢谢。

【问题讨论】:

  • 你能不能也发布一下 BYTE 和 SHORT 的定义
  • 您确定定义了“SHORT”吗?尝试用'short int'替换它。,
  • 我声明 BYTE *ByteArr;
  • 不要强制转换 malloc() 的返回值!
  • 代码中导致此调试器错误的行是什么?

标签: c malloc


【解决方案1】:

扩展 lavino 的答案以及当您使用 1024 之类的值时不会发生此问题的事实向我表明,您正在尝试从您分配的内存之外的内存中读取/写入。看起来您已经分配了 20 个短裤并尝试使用 ByteArr 指针读取第 100 个短裤。这将在调试器中显示“无法评估表达式”错误。

【讨论】:

    【解决方案2】:

    我不确定为什么它适用于其他值,但它无法评估的表达式可能是 ByteArr 的缺失变量。您已指定类型,但没有要分配的变量。

    BYTE *myByteArr = (BYTE *)malloc(sizeof(SHORT) * 20);
    

    【讨论】:

    • @BhirKamal:应该是 BYTE* ByteArr
    • 我还检查了 char 即 CHAR *ByteArr = (CHAR *)malloc(sizeof(CHAR) * 20);这也给出了同样的问题。
    【解决方案3】:

    更新:

    这是调试器中的一条消息,告诉您返回指向的内存不是有效的内存块。

    [不是这个]返回值是ENOMEM吗?如果是这样,由于某种原因没有分配内存,或者目标变量与 malloc() 调用的返回值不兼容。

    [不是这个]ByteArr 的类型是什么?是BYTE*,对吧?而不是BYTE[]

    [这个怎么样?] 在调试器消息出现时,ByteArr 是否仍然指向 malloc() 调用返回的相同地址?你可能不在数组的末尾,或者完全在分配的内存块之外。

    【讨论】:

    • 我还检查了 char 即 CHAR ByteArr = (CHAR)malloc(sizeof(CHAR) * 20);这也给出了同样的错误。
    【解决方案4】:

    我猜问题应该是:

    Byte* ByteArr = (BYTE *)malloc(sizeof(SHORT) * 20);
    

    代替:

    Byte ByteArr = (BYTE *)malloc(sizeof(SHORT) * 20);
    

    现在,我不确定您的代码中的 ByteArr 是什么,但从您的一个 cmets 到另一个答案,我发现这是问题所在。

    【讨论】:

    • 我使用 BYTE 作为 typedef unsigned char 。
    • 我还检查了 char 即 CHAR *ByteArr = (CHAR *) malloc(sizeof(CHAR) * 20);但这也带来了同样的问题。
    【解决方案5】:

    参考这个页面:

    http://www.codeguru.com/forum/showthread.php?t=430940

    看来您需要分配更多空间。此外,谷歌总是一个好帮手。

    【讨论】:

      【解决方案6】:

      我认为您正在软件中的其他地方纠正您的记忆。 尝试使用 IBM 的 Rational PurifyPlusBounds Checker 之类的工具。

      【讨论】:

        【解决方案7】:

        我的感觉是在此分配之前可能还有一个分配,并且您已经过度运行分配的内存空间。然后再次尝试在 malloc 逻辑可能失败的地方分配。

        malloc 没有找到下一个空闲块,因为之前的情况是过度运行,因此无法为提到的空间分配,如果你给 1024,malloc 正在寻找一个有这么多可用空间并且正在分配的块。

        尝试修复该分配,然后此问题将得到解决。

        【讨论】:

          猜你喜欢
          • 2012-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-23
          • 2012-12-26
          • 2014-03-28
          • 2012-02-26
          • 1970-01-01
          相关资源
          最近更新 更多