도와주세요!!
코드는 아래와 같습니다.
빨간색으로 된 부분에서 List에 이상한 값이 나오더군요.
그런데 GetFileList()에서의 printf()문으로 찍은 데이터들은 정상적으로 나옵니다.
고수님들의 조언을 부탁드립니다.
typedef struct {
char* FilePath;
char* FileName;
char* FileExtension;
int FileTotCnt;
}FILE_INFO;
int GetFileList(char* dir, FILE_INFO** file) {
int i, ret = 0;
int numOfItem, strSize;
FILE_INFO* FileBuffer;
struct dirent** psDirItem;
numOfItem = scandir(dir, &psDirItem, NULL, alphasort);
if(numOfItem <= 2) {
ret = Error_NoFile;
printf("No File In the Folder\n");
}
FileBuffer = (FILE_INFO*)calloc(sizeof(FILE_INFO), numOfItem);
for(i = 0 ; i < numOfItem ; i++) {
//File Total Count in the Folder
FileBuffer[i].FileTotCnt = numOfItem;
//File Path
FileBuffer[i].FilePath = (char*)calloc(sizeof(char), strlen(dir) + 1); //size + 0, -1 Error, +1 Ok ???
strcpy(FileBuffer[i].FilePath, dir);
//File Name
strSize = strlen(psDirItem[i]->d_name) + 1; //size + 0, -1 Error, +1 Ok ???
FileBuffer[i].FileName = (char*)calloc(sizeof(char), strSize);
strcpy(FileBuffer[i].FileName, psDirItem[i]->d_name);
printf("File Path Name Total Cnt in the Folder = [%s][%s][%d]\n", FileBuffer[i].FilePath, FileBuffer[i].FileName, FileBuffer[i].FileTotCnt);
}
*file = (FILE_INFO*)calloc(sizeof(FILE_INFO), numOfItem);
for(i = 0 ; i < numOfItem ; i++) {
memcpy(&((*file)[i]), &(FileBuffer[i]), sizeof(FILE_INFO));
printf("File Path Name Total Cnt in the Folder = [%s][%s][%d]\n", (*file)[i].FilePath, (*file)[i].FileName, (*file)[i].FileTotCnt);
}
for(i = 0 ; i < numOfItem ; i++) {
free(FileBuffer[i].FilePath);
free(FileBuffer[i].FileName);
}
free(FileBuffer);
printf("Get File List Seccess!...\n");
return ret;
}
FILE_INFO* File_data;
void main() {
int i;
GetFileList("/nand/", &File_data);
for(i = 0 ; i < File_data[0].FileTotCnt ; i++) {
printf("File Path Name Total Cnt in the Folder = [%s][%s][%d]\n",
File_data[i].FilePath, File_data[i].FileName, File_data[i].FileTotCnt);
}
}
아 그렇군요 코드에서는 돼어 있는데 이쪽으로 옮기다가 빠져 먹었나보네요...
아 그리고 GetFileList()에서는 지역변수인 FileBuffer에 관한 것만 free를 해주었는데.
실제로 인자로 반환 하는 것은 file이라는 변수 인데요. 이것에 관해서는 free를 해주지 않았는데요...
지금 보시면 FileBuffer 의 주소를 file의 주소로 복사해 줍니다.
file은 데이터를 가진것이 아니라 FileBuffer의 주소값을 가지고 그 데이타를 보여 주고 있습니다.
거기서 FileBuffer를 free 해버리면 값이 사라지겠죠?
그러면 FileBuffer의 주소를 가지고 있던 file은 당연히 free된 FileBuffer 데이타를 보여줍니다.
그래서 FileBuffer를 free 해주지 않으면 GetFileList 함수가 끝나도 main 함수에서 제대로 출력 됩니다.
안녕하세요!
GetFileList 함수를 보시면 마지막 부분에 free로 메모리 영역을 해제 해버리기 때문에
함수에서 빠져 나온뒤에는 제대로 된 값을 얻을 수가 없습니다.
그리고 메인 함수에는 i 가 정의가 안되어 있네요-_-;