【问题标题】:Allocation fails only on release仅在发布时分配失败
【发布时间】:2019-08-14 13:23:52
【问题描述】:

在调试程序时,它会按预期运行。运行发布版本时,它告诉我空间不足。为什么会发生这种情况,我怎样才能让它在发布 exe 中运行?

我找到了一些其他文章,但我不知道相似之处在哪里。 C malloc weird behavior on debug/release

#include <stdio.h> 
#include <stdlib.h>
#include <time.h>

#define AMOUNT  100000                              // amount of random numbers
#define RANDOM  (rand() & 0x1F) + (rand() << 16)    // 32 bit random number

struct sNumStruct {
    unsigned int uiNum;             // number
    struct sNumStruct *pNext;       // next
    struct sNumStruct *pPrev;       // previous
};

int main()
{
    /// initializing
    srand(time(NULL));              // rand() initializer
    unsigned int i = 0;             // counter
    struct sNumStruct * pNumbers;   // pointer to number structure
    struct sNumStruct * pStart;     // pointer to start of list
    struct sNumStruct * pLast;      // pointer to end of list

    /// random number generation
    printf("Generating %d random numbers ...\n", AMOUNT);

    pStart = (struct sNumStruct*)malloc(sizeof(struct sNumStruct*));    // allocating memory for first element
    if(pStart == NULL)              // allocation failed?
    {
        perror("-1");               // print error -1
        return -1;
    }
    pStart->pNext = NULL;           // next element is NULL
    pStart->pPrev = NULL;           // prev element is NULL

    pNumbers = pStart;              // point to number structure
    pNumbers->uiNum = RANDOM;       // get random number

    for(i = 0; i < AMOUNT; i++)     // repeat AMOUNT times
    {
        printf("%d,", i);           // <---------- DEBUG
        pNumbers->pNext = (struct sNumStruct*)malloc(sizeof(struct sNumStruct*));   // allocating memory for next element
        if(pNumbers->pNext == NULL) // allocation failed?
        {
            perror("-2");           // print error -2
            return -2;
        }
        (pNumbers->pNext)->pPrev = pNumbers;    // current element is previous from next
        pNumbers = pNumbers->pNext;             // next element
        pNumbers->uiNum = RANDOM;               // random number
        pNumbers->pNext = NULL;                 // next element is NULL
    }
    pLast = pNumbers;

    printf("\n... done generating numbers\n");

    // sort(&pNumbers);

    return 0;
}

我得到的输出是: “生成100000个随机数...... 0,1,-2:空间不足

进程返回 -2 (0xFFFFFFFE)"

“0,1”是它分配了多少元素。所以它在第一个“下一个元素”分配时失败。 "-2" 确认了上面的陈述

预计会看到: “生成100000个随机数...... 0,1, ....(不会输入所有数字)... 99998,99999, ... ...完成生成数字

进程返回 0"

【问题讨论】:

  • 也许你可以添加一些代码来释放你的指针。这可能使调试库有机会在使用比您为结构分配的空间更多的空间后检测堆损坏

标签: c console windows-10 codeblocks


【解决方案1】:

当你这样做时:

pStart = (struct sNumStruct*)malloc(sizeof(struct sNumStruct*));

您正在分配指针的大小,如果您在 64 位系统上,它可能是 8 字节。 你应该使用:

pStart = (struct sNumStruct*)malloc(sizeof(struct sNumStruct));(没有指针)

这将为您的结构分配所需的大小。

也许这会有所帮助?

【讨论】:

  • 哦,是的!我记得...非常感谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多