2014-12-07 1 views
1

매번 두 번째 패스에서 segfault를 제공하는 기능이 있으며 수정 방법을 모릅니다. 어떤 조언을 주시면 감사하겠습니다.Realloc segfault - 오래된 기존 크기가 유효하지 않습니다.

char* testBefore(int k){ 
    char* bin; 
    bin = calloc(1,1); 

    while(k > 0) { 
     bin = realloc(bin, strlen(bin)*sizeof(char)+1); 
     bin[strlen(bin) - 1] = (k % 2) + '0'; 
     bin[strlen(bin)] = '\0'; 
     k = k/2; 
    } 
    printf("\n%s.", bin); 
    return bin; 
} 

답변

1

견본.

char* testBefore(int k){ 
    char* bin; 
    int i = 0; 
    bin = calloc(1,1); 

    while(k > 0) { 
     bin = realloc(bin, (i+1)*sizeof(char)+1); 
     bin[i++] = (k % 2) + '0'; 
     k = k/2; 
    } 
    bin[i] = '\0'; 
    printf("\n%s.", bin);//reversed 
    return bin; 
} 
2

strlen은 배열의 크기를 제공하지 않습니다.

이 메모리 확대되지 않습니다 결과 때문에 정의되지 않은 동작을 생산하는 것이다 메모리에

bin = realloc(bin, strlen(bin)*sizeof(char)+1); //0+1 == 1 

그리고 전화 나 strlen을
strlen(bin) - 1는 음수가 될 것입니다 :

bin[strlen(bin) - 1] = (k % 2) + '0'; //bin[0-1] 

당신이해야 경우 할당 된 메모리의 크기를 유지하는 추가 변수를 사용하십시오. 0를 포함하는 1 바이트의 공간

+0

어떨까요? – user3885166

+0

@ user3885166 문자열의 길이입니다. – 2501

+0

차이점은 무엇입니까? 저는 char *가 C로 된 문자열이라고 생각 했습니까? – user3885166

1
char* bin; 
    bin = calloc(1,1); 

지금 bin 포인트.

while(k > 0) { 
     bin = realloc(bin, strlen(bin)*sizeof(char)+1); 

k에 대해 확실하지 않습니다. 어쨌든 strlen(bin) == 0 (bin[0] == '\0') 이후입니다. 이후 bin0을 저장하는 다른 1 바이트 공간을 가리 킵니다. 여기

 bin[strlen(bin) - 1] = (k % 2) + '0'; 

strlen(bin) 다시 돌아 0을하고 bin[0-1]에 접근하는 것은 분명히 아웃 오브 바운드 따라서 정의되지 않은 행동이 일어난 것입니다.

관련 문제