我写程序改变硬币。当我在循环中写printf打印i或j程序给出好的结果时,当我删除它时,程序停止。我认为这是内存的问题,但我在QT上写在Windows上,我无法访问valgrind。
任何人都可以检查一下吗?首先给出面额数,第二面额,最后是数量。
E.g:
3
1 3 5
8
结果应为2。
1
5
3
结果sholud是NO。
#include <stdio.h>
#include <stdlib.h>
#define INF 2147483647 //nieskonczonosc
void nominal(int nominaly, int T[], int k)
{
int i;
for (i=1; i<=nominaly; i++ )
{
int n=0;
scanf("%d", &n);
int j;
for ( j=0;j<=k-n;++j) {
if (T[j] < INF)
if (T[j]+1 < T[j+n])
T[j+n] = T[j]+1;
}
}
int kwota=0;
scanf("%d", &kwota);
if(T[kwota]==INF){
printf("NO");
}else
printf("%d", T[kwota]);
}
int main() {
int n=0;
scanf("%d", &n);
int k=10000;
int *T;
T = (int*)malloc(k * sizeof(int));
T[0]=0;
int i;
for (i=1;i<=k;++i)
{
T[i]=INF;
}
nominal(n, T, k);
free(T);
return 0;
}
答案 0 :(得分:1)
假设输入格式正确,我可以在代码中发现的唯一问题是:
if (T[j]+1 < T[j+n])
T[j+n] = T[j]+1;
当j
达到值k-n
时,T[j+n]
是一个越界访问权限,因为您获得了k-n+n
,因此您正在访问T[k]
,最后一个有效位置是T[k-1]
。这会在程序中调用未定义的行为 - 任何事情(包括按预期工作)都可能发生。
您可能希望将for
循环重写为:
for (j=0; j < k-n;++j) { ... }
您的代码中没有内存泄漏。