【发布时间】:2021-06-09 21:11:12
【问题描述】:
编辑:原来问题出在 15.line,我应该在括号内写 counter-1。
我应该注意,即将到来的问题是我被问到一个新的研究生级别的工作,所以请只指出我在哪里犯了错误。
你好,我正在尝试用这个算法编写一个简单的 C 代码,
- 输入一个数字
- 从给定的列表中,尝试模仿数字
- 打印出使用过的号码以及给定号码和模仿号码之间的差异
- 也是关于输入的最小值和最大值的规则
所以我为给定的任务做了这个(它还没有完成,但我的目标是现在在调试器中没有遇到问题);
#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) 个位置,这也是你的意思。