【发布时间】:2022-01-20 21:57:42
【问题描述】:
我正在实现一个程序,将a 数组中的所有值除以100,然后使用malloc 将它们存储在b 数组中。问题是在main 中打印b 的值时出现分段错误。
这是我的代码
#include <stdio.h>
#include <stdlib.h>
void divide(int *a, int n, double *b){
b=malloc(n*sizeof(double));
for(int i=0; i<n; i++){
b[i]=(double)a[i]/100.0;
}
//check: values still remain in b
for (size_t i = 0; i < 5; i++)
{
printf("%.2f ", b[i]);
}
}
int main(){
int a[]={1,2,3,4,5};
double *b;
divide(a,5,b);
//check: lost value and cause segmentation fault
for (size_t i = 0; i < 5; i++)
{
printf("%.2f ", b[i]);
}
free(b);
return 0;
}
那么导致这个问题的原因以及如何解决呢?
提前致谢。
【问题讨论】:
-
b=malloc(n*sizeof(double));对divide的调用者没有任何意义。 main 中的b保持不变。 ,并且在此过程中,您还会在divide中泄漏本地b分配的内存。通过地址传递b参数(因此是指向指针的指针)或利用函数的其他未使用的返回结果。 Thiis 是一个非常常见的 C 初学者问题,并且这个问题有 数百 个重复项,但可惜的是白话和问题描述如此多样化,以至于很难搜索为了。如果我找到链接,我会发布它。 -
malloc与核心问题无关。核心问题是对函数内部参数的赋值不会修改调用函数中的参数。调用函数中的参数b和函数divide中的参数b是不同的对象。 -
@DavidRanieri 关于内存管理,这完全无关紧要。对于 any 程序也可以这么说,它充斥着内存泄漏或其他情况,它们并非旨在无限运行(例如永久服务进程)。这种习惯是可怕的,应该尽早在年轻工程师的学习路径中消除。
-
@WhozCraig 我同意,但是年轻的工程师也应该区分什么是“真正的”内存泄漏和什么不是:stackoverflow.com/a/274433/1606345 OP sn-p 不会泄漏内存。
-
@DavidRanieri 每次调用函数
divide时都会分配内存,并且一旦函数返回,就无法访问该内存,即丢失。在我看来,这确实是内存泄漏。
标签: c malloc dynamic-memory-allocation pass-by-value function-definition