堆块在 ... 修改为 ... 过去请求的大小为 4

Heap block at ... modified at ... past requested size of 4

编辑:原来问题出在 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)它 returns“堆块在...修改在...过去请求的大小 4 ”。我还没有找到它的原因并且我对指针不擅长所以我不能说问题是指针(int * 数组)还是其他任何东西。重新分配有什么问题,我该如何解决?

array[counter]=AvailableValues[i];

在这一行中,您访问分配的 space.

最后一个元素之后的元素

你需要:

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