malloc() free() 에 관한 이해하기 힘든 버그입니다..

hyun1023의 이미지

#include "list_file.h"
#include "common.h"
#define MAX_PATH 2048
list_file* get_list_file( char *dirname ,int *max_count) {
        printf("start get_list_file()1\n");
        DIR *dir_ptr; /* the directory */
        struct dirent *direntp; /* each entry */
        printf("dirpath %s\n",dirname);
        strncpy(pub_present_path,dirname,strlen(dirname));
        list_file *p=NULL;
        list_file *head=NULL;
        list_file tail;
        printf("start get_list_file()3\n");

        head=(list_file*)malloc(sizeof(list_file));
        printf("::: Malloc :::\n");
        printf("start get_list_file()4\n");

        head->Next=NULL;
        tail.Next=NULL;
        printf("list_file() check\n");

        if ( ( dir_ptr = opendir( dirname ) ) == NULL ) {
                fprintf(stderr,"ls1: cannot open %s\n", dirname);
        }
        else {
                while ( ( direntp = readdir( dir_ptr ) ) != NULL ) {
                        dostat(dirname, direntp->d_name ,head,&tail);

                        }
        }
        p=head;
        int i=0;
        printf("list_file() while before\n");
        while(p=p->Next) {
                p->data.count=++i;
        }


        *max_count=i;
        closedir(dir_ptr);
        return head;
}


void dostat(char *dirname, char *filename ,list_file *head,list_file *tail) {
        struct stat info;

        list_file *node=(list_file *)malloc(sizeof(list_file));
        char path[strlen(dirname)+strlen(filename)+2];
        memset(path,0x0,sizeof(path));
        snprintf(path,(strlen(dirname)+strlen(filename))+2,"%s/%s",dirname,filename);




        if ( stat(path, &info) == -1 ) {
                perror( filename ); /* say why */
        }
        else {
                if(strcmp(filename,".")==0 || strcmp(filename,"..")==0) {
                        ;
                }
                else {

                        show_file_info(path, &info ,head,tail,filename);
                }

        }
}
void show_file_info( char *path, struct stat *info_p,list_file *head,list_file *tail,char *filename ) {

        struct tm *tm_ptr;
        char buffer[9];
        list_file *t;
        tm_ptr=localtime(&info_p->st_ctime);

        strftime(buffer,9, "%y/%m/%d", tm_ptr);
        list_file* node=(list_file*)malloc(sizeof(list_file));
        printf("::: Malloc() ::: %d\n",sizeof(list_file));

        node->Next=NULL;
        node->data.ori_date=info_p->st_ctime;
        node->data.ori_size = 0;
        if ( S_ISDIR(info_p->st_mode) ) node->data.isdir=1;
        else node->data.isdir=0;
        memset(node->data.filename,0x0,256);
        strncpy(node->data.filename,filename,strlen(filename));
        printf("읽음 %s ,f %d,p %d\n",node->data.filename,strlen(filename),strlen(node->data.filename));
        memset(node->data.date,0x0,9);
        strncpy(node->data.date,buffer,9);
        node->data.date[strlen(node->data.date)] = '\0';
        strncpy(node->data.initial,filename,50-3);
        node->data.initial[41]='.';
        node->data.initial[42]='.';
        node->data.initial[43]='\0';

        if(S_ISDIR(info_p->st_mode)) {
                node->data.size=0;
                strncpy(node->data.unit,"  ",2);

        }
        else {
        if(((long)info_p->st_size) > 1000000) {
                strncpy(node->data.unit,"MB",2);
                node->data.size=(float)((long)info_p->st_size) / 1000000;
                node->data.unit[2]='\0';
                node->data.ori_size = (long)info_p->st_size;

        }
        else {
                node->data.size=(float)((long)info_p->st_size) / 1000;
                strncpy(node->data.unit,"KB",2);
                node->data.unit[2]='\0';
                node->data.ori_size = (long)info_p->st_size;

        }
        }
        printf("%s\n",node->data.date);

        list_file *p;
        p=head;
        while(p->Next!=NULL) {
              printf("add node\n");

              t=p->Next;

              if(t->data.ori_date < node->data.ori_date) {

                        t=p->Next;
                        p->Next=node;
                        node->Next=t;
                        break;
              }
              p=p->Next;


              }
        p->Next=node;


}
void delete_all(list_file *head,int max_count) {
        list_file *p=NULL;
        list_file *t=NULL;


        p=head;

        while((p->Next)!=NULL) {
                t=p->Next;
                free(p);

                p=t;
                printf("::: free()\n");
        }
        printf("head free()\n");
        free(head);
}

파일,폴더가 0개 또는 2개 이상일때

메세지임
recv_message ; ㅅ
start message_process()
present path : /home/msghard/cho_hyunho@hotmail.com
number is : 0
:: /home/msghard/cho_hyunho@hotmail.com
::: free()
::: free()
head free()
start get_list_file()1
dirpath /home/msghard/cho_hyunho@hotmail.com
start get_list_file()3
::: Malloc :::
start get_list_file()4
list_file() check
::: Malloc() ::: 600
읽음 1 ,f 1,p 1
05/02/17
::: Malloc() ::: 600
읽음 훗 ,f 2,p 2
05/02/17
add node
list_file() while before

폴더,폴더가 1 개만 있었을때 읽음
recv_message ; ㅅ
start message_process()
present path : /home/msghard/cho_hyunho@hotmail.com
number is : 0
:: /home/msghard/cho_hyunho@hotmail.com
::: free()
head free()
start get_list_file()1
dirpath /home/msghard/cho_hyunho@hotmail.com
start get_list_file()3

이상하게 파일이 1개일경우에만 문제가 생기는데 이거때매 계속 헤메고 있습니다.. 당최.. 잘못됀곳이 어디인가요..[/code]

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.