
问一个linux下的C语言基础的编程问题呀,困扰我好久了。
#include<stdio.h>#include<stdlib.h>#include<string.h>fileapi(FILE*fp){intiret;printf(...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
fileapi( FILE *fp)
{
int iret;
printf( "api fp [%p]\n", fp );
fflush( fp);
iret = fclose(fp);
if( iret != 0)
{
perror("fclose");
}
else
{
printf( "close ok\n");
}
fp = NULL;
printf( "api fp close [%p]\n", fp );
}
main()
{
FILE *fp=NULL;
printf( "fp = [%p]\n", fp );
if( (fp = fopen( "./aaa", "w")) == NULL )
{
printf( " open file error \n");
exit(-1);
}
else
printf( "fp [%p]\n", fp );
fileapi(fp);
printf( " after close fp [%p]\n", fp );
exit(0);
}
为什么我调用函数关闭指针后无效呢?
输出结果如下:
\fp = [(nil)]
fp [0x1bd7010]
api fp [0x1bd7010]
close ok
api fp close [(nil)]
after close fp [0x1bd7010] 展开
#include <stdlib.h>
#include <string.h>
fileapi( FILE *fp)
{
int iret;
printf( "api fp [%p]\n", fp );
fflush( fp);
iret = fclose(fp);
if( iret != 0)
{
perror("fclose");
}
else
{
printf( "close ok\n");
}
fp = NULL;
printf( "api fp close [%p]\n", fp );
}
main()
{
FILE *fp=NULL;
printf( "fp = [%p]\n", fp );
if( (fp = fopen( "./aaa", "w")) == NULL )
{
printf( " open file error \n");
exit(-1);
}
else
printf( "fp [%p]\n", fp );
fileapi(fp);
printf( " after close fp [%p]\n", fp );
exit(0);
}
为什么我调用函数关闭指针后无效呢?
输出结果如下:
\fp = [(nil)]
fp [0x1bd7010]
api fp [0x1bd7010]
close ok
api fp close [(nil)]
after close fp [0x1bd7010] 展开
推荐于2016-06-26
展开全部
已经free/release fp.
你可以试试看 在after close fp [0x1bd7010] 之前 fclose(fp)
会有 double free 的警告
你可以试试看 在after close fp [0x1bd7010] 之前 fclose(fp)
会有 double free 的警告
更多追问追答
追问
问题就在这里了,我如果再去关闭的时候会出现问题,严重时甚至会coredump,但是为什么after close fp那里还能打印出来这个指针地址呢?
我想弄明白的就是:我调用了fileapi后,main中怎么判断这个指针是否已经关闭呢?
追答
以址传递的问题
1. 请改原型 fileapi(FILE *fp) 为 fileapi( FILE **fp)
2. API 内的fp 改 *fp
3. main() 内fileapi(fp) 改 fileapi(&fp)
fp = [(nil)]
fp [0x9c02008]
api1 fp [0x9c02008]
close ok
api fp close [(nil)]
after1 close fp [(nil)]
after2 close fp [(nil)]
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询