【问题标题】:Heap block at ... modified at ... past requested size of 4堆块在 ... 修改在 ... 过去请求的大小为 4
【发布时间】:2021-06-09 21:11:12
【问题描述】:

编辑:原来问题出在 15.line,我应该在括号内写 counter-1。

我应该注意,即将到来的问题是我被问到一个新的研究生级别的工作,所以请只指出我在哪里犯了错误。

你好,我正在尝试用这个算法编写一个简单的 C 代码,

  1. 输入一个数字
  2. 从给定的列表中,尝试模仿数字
  3. 打印出使用过的号码以及给定号码和模仿号码之间的差异
  4. 也是关于输入的最小值和最大值的规则

所以我为给定的任务做了这个(它还没有完成,但我的目标是现在在调试器中没有遇到问题);

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

uint16_t AvailableValues[10] = {50,100,150,250,400,500,600,750,850,1000};
int* divider(int number)
{
    int counter=1,i=9;
    int* array;
    array=(int*)malloc(counter*sizeof(int));
    while (i)
    {
        while(number/AvailableValues[i]>0)
        {
            printf ("%d %d %d\n",number,counter,i);
            array[counter]=AvailableValues[i];
            number-=AvailableValues[i];
            counter++;
            array=realloc(array,counter*sizeof(int));
        }
        i--;
    }
    if (number)
    {
        array[counter]=number;
    }
    return array;
}

int main()
{
    int number=0,total=0;
    int* list;
    printf ("Please enter a new target value:");
    scanf ("%d",&number);
    for (int i=0;i<10;i++)
    {
        total+=AvailableValues[i];
    }
    while (!(number>=AvailableValues[0] && number<=total))
    {
        printf ("Please enter a new target value:");
        scanf ("%d",&number);
    }
    list=divider(number);
    printf("Solution List");
    printf("-------------");
    for (int j=0;j<sizeof(list);j++)
    {
        printf("S[%d]:%d",j,list[j]);
    }
    return 0;
}

问题是,每当它第二次点击 realloc(我可以在控制台上获得一个 printf)时,它都会返回“在 ... 修改的堆块 ... 超过请求的 4 大小”。我还没有找到它的原因,而且我对指针不好,所以我不能说问题是指针(int * array)还是其他什么。重新分配有什么问题,我该如何解决?

【问题讨论】:

  • 该消息的出现通常是因为您的写入超出了分配的内存块的末尾。
  • 正如另一个用户给出的那样,我正在分配 x 个 int 大小的内存块,但试图写入第 (x+1) 个位置,这也是你的意思。

标签: c realloc


【解决方案1】:
array[counter]=AvailableValues[i];

在这一行中,您访问的是已分配空间的最后一个元素之后的元素。

你需要:

array[counter - 1]=AvailableValues[i];

【讨论】:

  • 我没想到会犯这么愚蠢的错误,显然我在弄乱代码时忘记了更改该行。非常感谢!
  • 从零开始数组索引以避免这样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多