c - 动态内存中的 free()
问题描述
我free()
在下面的代码中使用正确吗?是内存泄漏吗?free()
在主要部分而不是功能中使用是否有问题?如果是,有一种方法可以在函数中释放而不是在 main 中?
此代码将一个数组复制到另一个数组中。
int *copy(const int *arr,int n);
int main(){
int *p_arr1,*p_arr2;
int n,i;
printf("Insert size of array: ");
scanf("%d",&n);
p_arr1 = calloc(n,sizeof(int));
for(i=0;i<n;i++){
printf("Insert element %d of the array: ",i+1);
scanf("%d",p_arr1+i);
}
p_arr2 = copy(p_arr1,n);
for(i=0;i<n;i++){
printf("%d ",*p_arr2);
p_arr2++;
}
free(p_arr1);
free(p_arr2);
return 0;
}
int *copy(const int *arr,int n){
int i;
int *new;
new = calloc(n, sizeof(int));
for(i=0;i<n;i++){
new[i] += arr[i];
}
return new;
}
解决方案
只要您有malloc
(或在您的情况下calloc
)返回的指针,您就可以将它传递给free
您想要的时间和任何地方,它不必在同一个函数中。
但是,在打印 的内容的循环之后p_arr2
,您不再有calloc
函数内部返回的指针,因为您修改了循环中的指针。
您需要为循环使用临时指针变量:
int *p_arr2_tmp = p_arr2;
for (size_t i = 0; i < n; ++i)
{
printf("%d ", *p_arr2_tmp);
++p_arr2_tmp;
}
// Now we can free the memory pointed to by the original p_arr2 pointer
free(p_arr2);
或者您可以改用简单的数组索引:
for (size_t i = 0; i < n; ++i)
{
printf("%d ", p_arr2[i]);
}
// The pointer p_arr2 wasn't modified, so it can be passed to free
free(p_arr2);
推荐阅读
- node.js - 如何注销验证用户
- asp.net-mvc - 路由配置不带参数
- formatting - 提取具有与内容相关联的样式的word文档
- c# - 不支持 Xamarin 反射 Assembly.LoadFile
- java - 如何在 Windows 上增加 Tomcat 堆内存
- camunda - 在 Camunda 嵌入式表单中,如何指定绑定的变量范围?
- javascript - 使用日期列在 Google App 脚本中创建表
- java - 将 Spring bean 分配给不受 Spring 管理的字段
- jakarta-ee - Payara / Glassfish 5 上所需的持久性单元
- code-coverage - 源和对象位于不同目录时的覆盖率报告