关于c程序内存释放的两个小问题 (刚注册没分,请原谅)
下面是源程序 (两个问题我都写在里面相应的位置上了, 望高手指点):
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <error.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
/***** recursion directory manipulate ******
*author: hgalois
*last modify: 2007-7-21
*/
int recurDir(const char *path, int indent); /* recuring show dir items */
int main(int argc, char *argv[])
{
if(argc !=2)
{
printf("Syntax:%s path\n", argv[0]);
return 1;
}
recurDir(argv[1], 0);
return 0;
}
int recurDir(const char *path, int indent)
{
int i;
char tempStr[256], tempDname[256];
DIR *myDir;
struct dirent *myFile;
struct stat *fileStat;
fileStat = malloc(sizeof(struct stat));
if(!(myDir = opendir(path)))
{
perror("opendir()");
return -1;
}
while((myFile = readdir(myDir)) != NULL)
{
for(i = 0; i < indent; ++i)
putchar(' ');
printf("%s\n",myFile->d_name);
if(strncmp(myFile->d_name, ".", 1) && strncmp(myFile->d_name, "..", 2))
{
strcpy(tempStr, path);
strcat(tempStr, "/");
sprintf(tempDname, "%s", myFile->d_name);
strncat(tempStr, tempDname, 50);
if(lstat(tempStr,fileStat) == -1)
{
perror("lstat()");
return -1;
}
if(S_ISDIR(fileStat->st_mode) && !S_ISLNK(fileStat->st_mode))
recurDir(tempStr, indent + 4);
}
问题1:此处是否需要加上free(myFile)?我加上后会出现错误:(*** glibc detected *** free(): invalid pointer: 0x0804a084 ***
Aborted)
理论上我觉得应该加,因为指针再次赋值前一定先释放,否则会内存泄漏。
但是为什么会出错,请高手指点。
}
if(closedir(myDir) == -1)
{
perror("closedir()");
return -1;
}
free(fileStat);
问题2:此处是否需要加上free(myDir)?和问题1的出错方式一样。
return 0;
}
如果不加上这两条free语句程序运行正常,能得到预期结果。