动态编程,硬币改变,内存泄漏?

时间:2014-04-11 23:11:54

标签: c++ c qt coin-change

我写程序改变硬币。当我在循环中写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;

}

1 个答案:

答案 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) { ... }

您的代码中没有内存泄漏。

相关问题