malloc()后的内存一定要自己释放吗??遇到问题了!请高手指点!!
下面这段小程序我用到了malloc函数,是在while循环中,按说也应该在循环中的最后释放内存,但是那样的话会出现问题(不是程序不能运行,而是运行结果不是自己想要的),在循环外释放或者不释放的话就会达到自己的要求,请问,这个free函数应该放在什么地方?为什么放在循环里面会有问题呢?谢谢了!!!
---------------源程序(changedip.c)------------------
/*该函数的作用是:从文件/etc/tmp/dip中读取每一行的内容,将其存放到一个指针数组中,
*若遇到2.2.2.2的时候则跳过不读。
* "/etc/tmp/dip"文件中的内容如下:
1.1.1.1
2.2.2.2
3.3.3.3
4.4.4.4
5.5.5.5
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i=0;
static int dipnum=0;
int j;
FILE *fp;
char *line=NULL;
char *dip[10];
size_t len=0;
ssize_t read;
char * deadip="2.2.2.2";
/*strlen(deadip)==7;但是用getline函数从文件中读出的一行长度为8
*最后一个字符为换行符“\n”,后面在进行比较的时候,需要将从文件
*中读出的字符串中的最后一个字符去掉
*/
char *tmp=NULL; //暂存从文件中读出的一行字符串
fp=fopen("/etc/tmp/dip","r");
if(fp==NULL)
{
exit(EXIT_FAILURE);
}
while((read=getline(&line,&len,fp))!=-1)
{
tmp=(char *)malloc(7); //在此用malloc分配内存给tmp
strncpy(tmp,line,7);
printf("tmp:%s",tmp);
if(strcmp(deadip,tmp)!=0)
{
if((dip[i]=(char *)malloc(7))==0)
printf("allocate mem error!");
strncpy(dip[i],line,7);
printf("dip[%d]:%s",i,line);
printf("retrived line of length %zu: \n",read);
printf("line:%s\n",line);
i++;
// free(tmp); // 1:在此释放内存的话,结果不对
}
}
dipnum=i;
printf("the number of dip is:%d\n",dipnum);
for(j=0;j<i;j++)
printf("dip[%d]:%s\n",j,dip[j]);
for(j=0;j<i;j++)
free(dip[j]);
free(tmp); // 2:在此释放内存的话结果是正确的。
if(line)
free(line);
return EXIT_SUCCESS;
}