더블포인터 질문드려요

yeonjooo의 이미지

필요 없는 부분은 생략한 코드입니다. 주석문 부분만 봐주세요~

//구조체 선언 부분
#define BUF_SIZE 2500
typedef struct cmd_{
    char *id;
    char *action;
    char *pipe_id;
    char *command;
}cmd;
 
int main (int argc, char **argv){
//error:don't put configuration file
  if (argc <= 1)
    {
      fprintf (stderr, "configuration file must specified\n");
      return -1;
    }
 
    char *fileName=argv[1];
    char *str=(char*)malloc(sizeof(char)*BUF_SIZE);//buffer that save one command line
    FILE *fp;
    int cmd_count=0;//line number variable
 
      if((fp=fopen(fileName,"r"))==NULL){
        fprintf (stderr, "failed to load config file %s \n", fileName);
        return -1;
    }
 
    while(!feof(fp)){
        cmd_count++;
        fgets(str,BUF_SIZE,fp);
 
        if((str[0]!='#')&&(str[0]!='\n')){
            int i=0,invalid_cmd=0,err_result=0;
            err_result=check_err(str);
            if(err_result==1)
                fprintf (stderr, "invalid format in line%d ,ignored \n", cmd_count);
            else{
                printf("%s",str);
//cmd 구조체를 넘기는 부분
cmd *newCmd;
                changeToStruct(str,&newCmd);
                printf("  id=%s action=%s pipe_id=%s ",newCmd->id,newCmd->action,newCmd->pipe_id);
                printf("command=%s\n",newCmd->command);
            }
 
        }
    }
 
    free(str);
    fclose(fp);
  return 0;
}
//str을 구조체로 변환하는 부분
void changeToStruct(char *str,cmd**dst){//temporary void  original cmd    
    cmd newCmd;
    char *buf=str;
    char **bufSection=(char**)malloc(sizeof(char*)*4);
    int i=0,j=0;
//구분자를 기준으로 하여 str을 나눈 다음 bufSection[j]에 넣는 부분
    for(;j<3;j++){
        bufSection[j]=(char*)malloc(sizeof(char)*BUF_SIZE);
        while(buf[i]==' ')
            i++;
        if(buf[i]==':'){
            strcpy(bufSection[j],"no");
            i++;
        }
        else{
            strcpy(bufSection[j],strtok(buf,":"));
            i=strlen(bufSection[j])+1;//1->delim
        }
        buf=&buf[i];
        i=0;
    }
//여기부터 문제입니다ㅠㅠ
    *dst=(cmd*)calloc(sizeof(cmd),sizeof(char));
 
    strncpy((*dst)->id,bufSection[0],strlen(bufSection[0]));
    strncpy((*dst)->action,bufSection[1],strlen(bufSection[1]));
    strncpy((*dst)->pipe_id,bufSection[2],strlen(bufSection[2]));
    while(buf[i]==' ')
        i++;
    if(buf[i+1]=='\0')
        strncpy((*dst)->command,"no",strlen("no"));
    else
        strncpy((*dst)->command,buf,strlen(buf));
 
    for(j=0;j<3;j++)
        free(bufSection[j]);
    free(bufSection);    
    return;
}

bufSection값들은 정상으로 들어갑니다. 원래는 걍 배정문으로 해서 넣었는데 free()하면서 쓰레기값이 들어가더라구요.물론 함수가 끝나도 마찬가지겠지만. 그래서 strncpy함수를 썼는데, 배정문으로 할때는 되던게 segmentation fault가 뜨네요. 도와주시면 정말 감사하겠습니다!
Anti-Lock의 이미지

    strncpy((*dst)->id,bufSection[0],strlen(bufSection[0]));
    strncpy((*dst)->action,bufSection[1],strlen(bufSection[1]));
    strncpy((*dst)->pipe_id,bufSection[2],strlen(bufSection[2]));

요기서 strncpy호출하기전에
(*dst)->id ,action 등에 malloc을 먼저 하시던지
strdup함수를 사용하면 될것 같네요.
yeonjooo의 이미지

감사합니다! 바로 해결되었습니다

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.