는 C

2017-01-15 7 views
0
나는이 방법으로 문자열의 앞에 제로를 추가 할

에서 문자열에 0을 추가는 C

void addFrontzeros(char *str,int zeros) 
{ 
    if(zeros==0) 
    { 
     return; 
    } 

    char *temp=malloc((strlen(str)+1+zeros)*sizeof(char)); 

    int i=0; 
    for(;i<zeros;i++) 
    { 
     temp[i]='0'; 
    } 

    int j=0; 
    for(;j<strlen(str);j++) 
    { 
     temp[j+zeros]=str[j]; 
    } 
    temp[strlen(str)+zeros]=0; 
    str=realloc(str,(strlen(temp)+1)*sizeof(char)); 
    strcpy(str,temp); 
    free(temp); 
} 

을하지만 난 다른 방법에서 호출 할 때 문자열은 호출 후 비어 있습니다. 와

char *mul = malloc(sizeof(char)*2); 
    mul[0]='0'; 
    mul[1]=0; 

을 Valgrind의 난이 오류가있어 : 호출자 문자열은 다른 방법으로 다음과 같이 할당 0x5201b00 크기의 블록 내부에 0 바이트 2 free되기를

내가 문제라고 생각입니다 주소 그것은 늘 당신이 (아마도) 기능 내부 str을 수정하고 realloc를 호출하여 여기

+2

함수를 떠난 후'realloc'에 의해 반환 된 포인터를 잃어 버리고 있습니다 (로컬 포인터에 할당 됨). 그리고 두 번째 루프에 널 종결자를 설정하지 않았습니다. – myaut

답변

5

작동하지만 addFrontzeros의 호출자가 str의 새로운 값이 표시되지 않는 이유 realloc과 함께,하지만 난 생각이 없습니다. 의 이전 버전은 여전히 ​​realloc 이후 유효한 데이터를 가리 키지 않습니다.

함수는 return str (x = addFrontzeros(x, n)이라고 부를 수 있음)이거나 char **을 허용하여 포인터를 제 위치에서 수정할 수 있어야합니다.

StoryTeller가 지적한 것처럼 str = realloc(str, ...)realloc이 실패한 경우 안전하지 않습니다. 먼저 reallocNULL을 반환했는지 그리고 두 번째 이유는 이 되려면 NULL이 반환되므로 이전 str이 할당되었지만 포인터를 잃어 버렸기 때문에 메모리 누수가 발생했기 때문입니다. 최소한의 방법은 당신이 다른 방법으로 장애를 처리하는 경우 비록

char *new_str = realloc(str, strlen(temp)+1); 
if (!new_str) { 
    perror("addFrontzeros: realloc"); 
} else { 
    str = new_str; 
} 

것 처리하기 위해, 당신이 할 수있는, 원래 str은 여전히 ​​유효하고 수정되지 않은 것입니다.

또 다른 문제점은 strlen(str) 바이트 만 복사한다는 것입니다.이 바이트는 종료되는 0 바이트를 포함하지 않으므로 문자열이 올바르게 종단되지 않습니다. 너 자신을 끝내기 0을 추가하거나, 단순히 하나 이상의 바이트를 복사하십시오. (str이 올바르게 종료 된 것으로 가정 할 수 있기 때문에).

마지막으로, 보조 노트로 sizeof(char)은 정의에서 1이므로 배수가 필요하지 않습니다.

+1

'realloc'의 결과를 기존 포인터에 맹목적으로 할당합니다 포인터도 안전하지 않습니다. – StoryTeller

+0

@StoryTeller 그것은 실패시 'NULL'을 반환하지만 기존 메모리를 수정하지 않기 때문에 맹인 재 할당이 누수를 일으키기 때문에 맞습니까? – hobbs

+0

그래, 그건 내가 염두에 두었던거야. 재 할당 실패로 보아도 반드시 프로그램이 토스트가 아닐 수도 있습니다 ('제로'가 거대한 경우). 함수의 실패로'str'이 수정되어서는 안됩니다. – StoryTeller