2011-09-26 5 views
2

이 코드 섹션을 제대로 작동시키지 못했습니다. 문자 배열을 복사하여 환경 변수를 검사하기 위해 얼마나 많은 토큰을 동적으로 할당하고 저장할 것인지 계산할 수 있도록 노력하고 있습니다. 그러나 원래 문자열을 strncpy하려고하면 segfaulting 유지합니다.strncpy segfault

void echo(char *str1) 
    { 
     char *token, *temp; 
     char *saveptr1; 
     int j, i, k, counter; 
     char *copy; 

     strncpy(copy, str1, 80); 

     const char *delim = " "; 
     i = strlen(copy); 

     for(j = 0; j < i; j++, copy = NULL) 
     { 
     token = strtok_r(copy, delim, &saveptr1); 
     counter++; 
     if(token == NULL) 
     { 
      counter--; 
      break; 
     } 
     } 

     // initialize token array for echo 
     char *tokAr[counter]; 
     for(j = 0; j < counter; j++) 
     tokAr[j] = malloc(80*sizeof(char)); 

     for(j = 0, k = 0; j < i; j++, str1 = NULL) 
     { 
     tokAr[k] = strtok_r(str1, delim, &saveptr1); 
     if(tokAr[k] != NULL) 
     { 
      if(strchr(tokAr[k], 36) != NULL) 
      { 
       temp = enviro(tokAr[k]); 
       printf("%s ", temp); 
      } 
     else 
      printf("%s ", tokAr[k]); 
     } 
     else 
      break; 
     } 

     for(k = 0; k < counter; k++) 
     free(tokAr[k]); 
    } 

    char* enviro(char *ret) 
    { 
     char *copy, *expand, *saveptr; 
     const char *delim = "$"; 
     strcpy(copy, ret); 
     expand = strtok_r(copy, delim, &saveptr); 

     return getenv(expand); 
    } 

나는 그것이 내가이 (가) str1과 문자 배열에 전달하지만 GDB에서 그것을 알아낼 수 없습니다 복사하는 방법을 함께 할 수있는 뭔가가 알고있다. 어떤 도움도 크게 받으실 수 있습니다.

답변

9

copy에 메모리를 할당하지 않았습니다.

char *copy; 
strncpy(copy, str1, 80); 

시도 malloc 또는 strdup는 전체 81 문자가 필요하지 않은 경우.

copy = malloc(81); 
strncpy(copy, str1, 80); 

/* Or strdup. */ 
copy = strdup(str1); 
+0

내가 그것을 시도하자. – GFXGunblade

+0

그 것이었다. 감사합니다. – GFXGunblade

+2

strncpy가 목적지 문자열을 제로 - 종료하지 않음을 알아 두십시오! 이 기능을 사용하는 경우는 거의 없습니다. 이 경우 strdup은 아마도 당신이 원하는 것일 것입니다. 또한 strdup이 새로운 메모리를 할당하기 때문에 복사본을 무료로 만들어야한다는 점에 유의하십시오! – harald

2

copy에는 유효한 할당 주소가 포함되어 있지 않습니다. copy을 사용하기 전에 malloc으로 충분한 메모리를 할당하십시오. 또한 큰 프로그램에서 메모리 누수를 막기 위해 사용을 마친 후에는 copy을 비우십시오.

0

저는 함수 에코에서 변수 카운터를 초기화하지 않았으며이를 증가시키고 감소시키는 것으로 생각합니다. 해보십시오.