c - 重复分配内存而不释放它
问题描述
下面的代码显示了一个重复分配内存而不首先调用的示例free
。相反,它**sign
在循环后释放。
#include <stdio.h>
#include <stdlib.h>
float ** fun(int nloc)
{
float **sign;
int i,nt=100,it,k;
sign=(float **)calloc(nloc,sizeof(float *));
for (i=0;i<nloc;i++)
sign[i] = (float *)calloc(nt,sizeof(float *));
for (it=0;it<nt;it++){
for (k=0;k<nloc;k++){
sign[k][it]=it*0.2;
}
}
return sign;
}
int main(int argc, char *argv[])
{
int i,isrc,n=3,nloc=1;
float **sign=NULL;
for (isrc=0;isrc<n;isrc++){
sign = fun(nloc);
}
for (i=0;i<nloc;i++){
free(sign[i]);
}
free(sign);
exit(0);
}
这是一个正确的代码片段。我的问题是:为什么我们可以在每次迭代中为指针分配内存而不必先释放它是合法的?
【补充信息】:
大家好,我认为有一种情况我们无法free
在循环中记忆。如果buffer=p
andp
被定义在循环之外,例如:
float *buffer, *p;
/* Elements of p calculated */
for (...){
/* allocate memory for **buffer */
buffer = p;
free(buffer)
/* if free here will cause p lost */
}
如果buffer
在每个循环结束时释放,可能会p
因为buffer
和p
共享相同的内存地址而导致丢失。
解决方案
为什么我们可以在每次迭代中为指针分配内存而不必先释放它是合法的?
释放动态分配的内存的责任留给了程序员。这是合法的,因为编译器不强制执行它,尽管有代码检查工具可以标记这个问题。
释放动态分配的内存应该按照分配的相反顺序进行。例如:
for (i=0;i<nloc;i++)
free(sign[i]);
free(sign);
推荐阅读
- selenium - 切换回框架后找不到动态元素
- sql-server - Ms Access - 更新链接表失败 [错误 #229]
- android - MPAndroidChart - 折线图 - 缩小没有 X 值的图形部分
- unix - unix中的管道和叉子|?
- python - 如何选择同名的班级。(Instagram Selenium BOT)
- spring - 如何在 Spring Boot 2 中禁用管理端口的安全性
- java - ADB PULL 命令
- regex - 在 Spring 中匹配包含 .* 的正则表达式模式
- shell - CPUminer 配置文件错误
- ios - Watchkit - didReceiveApplicationContext 仅在第一次工作