2013-10-22 3 views
0

함수 내에서 동적 할당/rellocation는C - 나는 C에서이 기능을 작성했습니다

void add_to_str(char *character, char ** string, int* index) 
{ 
    //we dont expect *string to be NULL !! no condition done 
    if (*index == 0) //if str is empty we will alloc AVGLEN(32) characters space 
     *string=malloc(AVGLEN*sizeof(char)); 

    if (*string == NULL) //malloc fails? 
    { 
     fprintf(stderr,errors[MALLOC]); 
     exit(99); 
    } 
    //string length exceeds 32 characters we will allocate more space 
    if (*index > (AVGLEN-1) || character== NULL)// or string buffering ended, we will free redundant space 
    { 
     *string=realloc(*string,sizeof(char)*((*index)+2));//+1 == '\0' & +1 bcs we index from 0 
     if (*string==NULL) //realloc fails? 
     { 
      fprintf(stderr,errors[REALLOC]); 
      exit(99); 
     } 
    } 
    *string[(*index)++]=*character; 
} 
(함수 포인터 뒤에 문자의 인덱스에 대한 포인터가 지정되면 (자), char*받을 필요 공간을 할당하고, 문자를 삽입한다)

언제 *index > 0, 그것은 나에게 라인 세그먼트 오류를 ​​제공

*string[(*index)++]=*character; 

이 기능 (의 변형 char* 뒤에 바로 malloc 다음에 문자를 할당) 완벽하게 작동합니다.

+0

평범하지 않은 표현을 자신의 문장으로 옮기는 것이 좋습니다. 컴파일러는 최적화 후에도 동일한 출력을 생성해야하며 예기치 않은 동작을 피하고 명확한 코드를 사용할 수 있습니다. – hyde

답변

3

당신이 문을 조심해야 : 배열 인덱스는 포인터 역 참조보다 더 높은 우선 순위를 가지고 있습니다

*string[(*index)++]=*character; 

때문입니다. 따라서 이것은

*(string[(*index)++]) = *character; 

과 동일합니다. 원하는 것은 같지 않습니다.

(*string)[(*index)++] = *character; 

결함이있는 코드 때문에 여전히 유효 문이 **string에 해당하는 경우에 *index == 0을 위해 작동하지만 index > 0, string 잘못된 위치에 역 참조하려고 할 때 : 당신이 원하는 string+index.

+0

대단히 감사합니다. – Smarty77

0

주 그 같은 일을 :

ptr = realloc(ptr, ...); 

는 정말 나쁜 패턴이다. realloc()이 실패하면 이전에 할당 된 영역은 더 이상 프로그램에 액세스 할 수 없으므로 유출됩니다. 올바른 패턴은 다음과 같습니다.

char* str_new = realloc(string, ...); 

if (str_new != NULL) 
    string = str_new; 
else 
    /* handle allocation error */ 
+0

그래, 지금 당장이 프로그램에서 btw를 확실히 볼 수 있습니다. 재 할당이 실패 할 때 문자열의 나머지 부분은 필요 없지만, 적어도 제가 조심스럽게 고마워 할 수는 있습니다. :) – Smarty77

0

기능을 시작하려면 fprintf에 형식 문자열이 필요합니다.

e.e.

fprintf(stderr,errors[MALLOC]); 

은 아마도 유효하지 않습니다.

또한이 기능의 목적은 무엇입니까? 서술이없는 것 같습니다.

+0

btw 그것은 작동합니다 * 연관 문자열 배열 (이 같은 smt)의 형태입니다 const char * const errors [] = { [MALLOC] = "오류 : Malloc()의 동적 메모리 위치 지정에 실패했습니다. \ n" } – Smarty77

관련 문제