动态编程,硬币变化,内存泄漏?
Posted
技术标签:
【中文标题】动态编程,硬币变化,内存泄漏?【英文标题】:dynamic programming, coin change, memory leak? 【发布时间】:2014-04-11 23:11:54 【问题描述】:我写程序来换硬币。当我在循环中编写 printf 以打印 i 或 j 程序时会产生良好的结果,当我删除它时,程序会停止。我认为这是内存问题,但我在 QT 中的 Windows 上编写,我无法访问 valgrind。
任何人都可以检查这个?首先给出面额的数字,第二个是面额,最后是数量。
例如:
3
1 3 5
8
结果应该是 2。
1
5
3
结果应该是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;
【问题讨论】:
对不起,这段代码与 Qt 有什么关系?或许,去掉qt标签会更好。 【参考方案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) ...
您的代码中没有内存泄漏。
【讨论】:
感谢您的帮助,在malloc
中将k*sizeof(int)
更改为(k+1)*sizeof(int)
,效果很好:)以上是关于动态编程,硬币变化,内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章
IOS性能调优系列:使用Instruments动态分析内存泄漏