gpt4 book ai didi

c - 返回指针的函数内部的内存泄漏(已解决)

转载 作者:行者123 更新时间:2023-12-04 10:23:46 26 4
gpt4 key购买 nike

我正在使用一个函数,它集成了一个多项式,该多项式作为指针参数提供给函数。在函数内部,我使用了 malloc以便为将返回的积分多项式分配内存。

问题是,在将它返回到主函数之前我无法释放它,因为那样我将什么都不返回。但是如果我在返回后释放它,那么我显然什么都不做,因为程序将在读取空闲之前返回主函数。

这是功能。

double * integrar(int n, double *dp, double *mitjana) {

double *p, mitj = 0;
int i;

p = (double *)malloc((n + 2)*sizeof(double));
if(p == NULL) {printf("\nError de memoria.\n"); exit(1);}

p[0] = 1;

for(i = 1; i <= n + 1; i++)
p[i] = dp[i - 1]/i;

for(i = 0; i <= n + 1; i++)
mitj += p[i];

mitj = mitj/(n + 2);
*mitjana = mitj;

return p; }

我需要以某种方式释放 p。这是主要功能:
int main(void) {

int n, k, i, j;
double mitjmax, mitjaux, **p;
mitjmax = 0;

printf("Dona el grau del polinomi.\n");
scanf("%d", &n);
printf("\nDona el nombre de vegades que el vols integrar.\n");
scanf("%d", &k);

p = (double **)malloc((k + 1)*sizeof(double *));
if(p == NULL) {printf("\nError de memoria.\n"); exit(1);}
for(i = 0; i < k + 1; i++) {
p[i] = (double *)malloc((n + 1 + i)*sizeof(double));
if(p[i] == NULL) {printf("\nError de memoria.\n"); exit(1);}
}

printf("\nDona el polinomi.\n");
for(i = 0; i <= n; i++)
scanf("%le", &p[0][i]);

for(i = 0; i <= n; i++)
mitjmax += p[0][i];
mitjmax = mitjmax/(n + 1);

for(i = 1; i <= k; i++) {
p[i] = integrar(n + i - 1, p[i - 1], &mitjaux);
if(mitjaux > mitjmax)
mitjmax = mitjaux;
}

for(i = 0; i <= k; i++) {
printf("grau %d:", i + n);
for(j = 0; j <= n + i; j++)
printf("%11.4le ", p[i][j]);
printf("\n");
}
printf("El maxim de les mitjanes dels coeficients: %le\n", mitjmax);

for(i = 0; i <= k; i++)
free(p[i]);
free(p);

return 0;
}

最佳答案

只要你正确地记录它,不释放没有任何问题malloc() ed 内存,然后返回给调用者。

特别是在库中,调用者必须意识到释放内存是他们的可能性,并且必须清楚如何这样做。

但站在调用者的角度,你必须清楚你的指针会发生什么以及如何使用它。您可以看到对 integrar() 的调用作为对 malloc() 的(间接)调用,所以真正的问题是你的作业 p[i] = (double *)malloc((n + 1 + i)*sizeof(double));其次是 p[i] = integrar(n + i - 1, p[i - 1], &mitjaux);不带中间件 free(p[i]) ,因为然后第一个 malloc() ed 内存基本上丢失了。

关于c - 返回指针的函数内部的内存泄漏(已解决),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60720405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com