2013-11-02 84 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陣列可在位置0被索引到(幷包括)n-1

另外,您不需要sizeof(char),因爲它總是1.在這種情況下,圍繞*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()期間也會導致段錯誤,即使realloc本身是正確的。

相關問題