2013-11-02 1 views
1

이 코드는 때때로 세그멘테이션 오류를 발생시킵니다. 왜 이것이 가능합니까?*** glibc가 감지되었습니다. *** realloc() : 이전 크기가 유효하지 않습니다. 3

void concatenarAlBuffer(char **destino, char caracter) 
{ 
char matrizAux[1]; 
matrizAux[0]=caracter; 
matrizAux[1]='\0'; 

(*destino) = realloc((*destino),2+(strlen((*destino))*sizeof(char))); 

if ((*destino)==NULL) 
{        
    perror("Error al reservar memoria\n"); 
    exit(-1);        
} 

strcat((*destino),matrizAux); 
} 
+2

그런데 NUL char을 추가하기 위해 스택에 임시 버퍼를 사용할 필요가 없습니다. 'realloc()'을 사용하여'destino'를 확장시킨 후에'strncat (* destino, & caracter, 1);을 간단히 수행 할 수 있습니다. 또한, 이전에'strlen()'을 호출 한'strcat()'을 개인적으로 사용하지 않을 것입니다. 왜냐하면 나는 CPU 낭비를 느끼기 때문입니다. 그러나 코드가 더 읽기 쉽다고 주장 할 수도 있습니다. – user2719058

+0

'concatenarAlBuffer'는 어떻게 사용하나요? 충돌 할 때 프로그램에서 어떤 인수를 전달합니까? – zubergu

답변

1

matrizAux은 한 문자 만 저장할 수 있습니다. matrizAux[1]에 액세스 할 수 없습니다. 범위를 벗어났습니다.

이렇게 matrizAux을 선언

char matrizAux[2]; 

n -elements 어레이가 (포함) n-1를 위치 0으로 인덱싱 될 수 있다는 것을 기억하라.

또한 항상 1이기 때문에 sizeof(char)이 필요 없습니다. *destino 주변의 괄호는 쓸모가 없으므로 불필요하게 읽을 수 있습니다. 여기에 내가 코드를 변경 할 방법은 다음과 같습니다

void concatenarAlBuffer(char **destino, char caracter) { 
    char matrizAux[2]; 
    matrizAux[0]=caracter; 
    matrizAux[1]='\0'; 

    *destino = realloc(*destino,2+strlen(*destino)); 

    if (*destino == NULL) {        
     perror("Error al reservar memoria\n"); 
     exit(-1);        
    } 

    strcat(*destino, matrizAux); 
} 
1

당신은

char matrizAux[1]; 

1 문자 긴 배열을합니다.
그리고 당신은

matrizAux[1]='\0'; 

과의 '두 번째 요소에이 힘을 쓰거나 메모리 어레이의 의미를에 따라 충돌하지 않을 수 있습니다.
하지만 아직 뭔가가 누락 된 것 같습니다.
realloc은 이전에 malloc- 또는 calloc -ated 인 것만 재 할당 할 수 있습니다.
이 조건을 충족시키지 못하는 것을 다시 할당하려고하면 오류가 발생합니다. 그리고 그것은 아마 여기에서 진실한 경우입니다.

0

char matrizAux[1]은 하나의 문자 만 포함합니다. matrizAux[1]에 액세스 중이므로 범위를 벗어난 것으로 인해 메모리가 손상됩니다. 이로 인해 런타임의 내부 데이터가 손상되어 결과가 realloc() 동안 segfault가되는 결과를 초래할 수 있습니다.

관련 문제