2014-02-09 2 views
2

문자열을 함수에 전달할 때 함수를 사용할 때 sizeof (array)/sizeof (array [0]) 문자열의 길이를 결정합니다. 그래서 문자열의 끝에 문자를 추가하는 데이 기능을 궁금 올바른지 :문자열 끝 부분에 문자를 추가하는 함수

void append_ch_to_str(char *str, char ch) 
{ 
    int length = strlen(str); 

    str = (char *)realloc(str, (length + 1) * sizeof(char)); 

    length = strlen(str); 

    *(str + length - 1) = '\0'; 
    *(str + length - 2) = ch; 
} 
+0

나는 그것이 맞지 않다고 생각한다. – BLUEPIXY

+3

(1) 문자열의 길이는'realloc()'에서 변경되지 않으므로 두 번째'strlen()'은 불필요합니다. (2) 할당하는 길이가 너무 작습니다 (하나씩). (3) 새로운 업데이트 문으로 잘못된 위치에 글을 쓰고 있습니다. (4) 할당 된 메모리의 새로운 위치를 호출 코드로 전달하지 않습니다. 이 중 (1) 가장 심각한 것은 아닙니다. 나머지는 모두 코드의 올바른 작동에 중요합니다. 주의 :'strlen()'은 문자열의 바이트 수를 널 바이트까지 계산합니다. 이것은 문자열에 할당 된 공간의 양과 관계가 있거나 없을 수 있습니다. –

+0

이 함수를 반복적으로 호출하면 잠재적 인 2 차 동작에 대해 생각할 수도 있습니다. 여러 가지 목적을 위해 더 나은 인터페이스는 문자열에 문자열을 추가하는 것이고 한 문자열은 특수한 경우입니다. 때로는 현재 디자인이 아플 수도 있습니다. 한번에 하나의 문자를 더 잘 추가하는 것은'char *'나'char **'보다 더 복잡한 문자열 유형을 필요로합니다. –

답변

2

그것은 정확하지 않습니다 만, 다음과 같이 해결할 수 있습니다

char *append_ch_to_str(char *str, char ch) 
{ 
    int length = strlen(str); 
    char *str2; 

    str2 = (char *)realloc(str, (length + 2) * sizeof(char)); 
    if (!str2) { 
     free(str); 
     return NULL; 
    } 
    str = str2; 

    str[length] = ch; 
    str[length+1] = 0; 

    return str; 
} 

이 모든

가 가정 한 것입니다 str 포인터가 이미 malloc/calloc/strdup과 함께 메모리를 할당한다는 것입니다.

할당은 0 문자를 끝내고 추가 된 문자를 하나 더 할당해야합니다.

문자열 길이의 두 번째 계산은 0이 아닌 문자를 계산하고 할당 된 버퍼의 크기를 반환하지 않기 때문에 동일한 결과를 갖습니다.

충분한 메모리가 없을 경우 NULL을 반환하는 재 할당을 확인해야합니다. 수정 : realloc 반환 값 확인 - 추가 이것은 미완성 된 코드를 복사하는 것을 막을 수 있습니다.

realloc은 동일한 포인터 값을 반환하는 것이 보장되지 않기 때문에 이것은 잘못된 접근법이기도합니다. 이 함수는 새로운 포인터 값을 반환 할 것이고 원래 포인터 값은 실행 후에 더 이상 유효하지 않을 것입니다.

+0

맞아, realloc 같은 포인터를 반환하지 않을 수 있습니다. 나는 고칠 것이다. – bbonev

+1

'x = realloc (x, ...)'는 안티 패턴입니다. realloc이 NULL을 반환하면, 가리키는 데 사용 된 메모리'x'을 유출했습니다. (반환 값을 검사해야한다는 것을 알고 있지만 표시해야합니다. 그렇지 않으면 복사 및 붙여 넣기가 가능합니다.) – rici

+0

완전히 동의합니다. 그것도 수정했습니다 – bbonev

1

realloc은 str과 다른 포인터를 반환 할 수 있으므로 메모리 누수가 발생합니다.

또한 이로 인해 새 문자열이 호출자에게 다시 전달되지 않습니다.

+0

하지만 ference가 전달한 문자열이 아닙니까? –

+0

@ FernandoKarpinski- 아니오 - 당신은 char ** –

+1

@ FernandoKarpinski를 전달해야합니다. C에서 참조로 전달되는 것은 없습니다 ... 모든 매개 변수는 값으로 전달됩니다. –

관련 문제