2017-01-07 2 views
-1

Die Funktion erhalten eine Sent und müssen zwischen den 'n' ersten Worten ersetzen. Wenn es zum ersten Realloc kommt, stoppt das Programm und der Fehler wird angezeigt. Ich versuche eine Menge Kombination von Sätzen, die neue Erinnerung, nach der ich frage, ist größer als die existierende Erinnerung.Fehler beim Realloc in c (Ausnahme trown (ucrtbased.dll))

meine Funktion:

void Reverse(char **sentence, int n) 
{ 
    int m; 
    char *temp; 
    for (m = 0; m < n; m++, n--) 
    { 
     temp = (char*)malloc(strlen(sentence[m]) * sizeof(char)); 
     temp = sentence[m]; 
     sentence[m] = (char*)realloc(sentence[m], strlen(sentence[n]) * sizeof(char)); 
     sentence[m] = sentence[n]; 
     sentence[n] = (char*)realloc(sentence[n], strlen(temp) * sizeof(char)); 
     sentence[n] = temp; 
     free(temp); 
     printf("%s ", sentence[m]); 
    } 
} 

Error

enter image description here

+0

Welchen Fehler haben Sie gefunden? –

+0

Wenn Sie nicht genau wissen, was Sie tun, ist es zu kurz, gerade genug Platz mit 'strlen (x)' zuzuweisen. – usr2564301

Antwort

2

Werfen Sie einen genaueren Blick auf diese beiden Zeilen:

temp = (char*)malloc(strlen(sentence[m]) * sizeof(char)); 
temp = sentence[m]; 

Im ersten Speicher zuweisen Sie und temp Punkt machen zu dieser Erinnerung. In der nächsten Zeile geben Sie temp neu, um woanders zu zeigen.

Sie tun dies auch für Ihre Umverteilungen.

Beachten Sie auch, dass z.

sentence[m] = sentence[n]; 

Sie kopieren einen Zeiger und nicht den Inhalt des Speichers der Zeiger auf zeigt. Es ist eine flache Kopie. Wenn Sie dies beheben, um den tatsächlichen Inhalt zu kopieren (und eine tiefe Kopie haben), dann müssen Sie daran denken, dass Zeichenfolgen in C durch ein zusätzliches Zeichen beendet werden, das nicht von strlen gezählt wird. Zum Beispiel ist die Zeichenfolge "hello" eigentlich sechs Zeichen lang mit dem Terminator. Sie müssen auch Speicherplatz für diesen Terminator reservieren.

+0

also eigentlich muss ich es (strlen (x) +1) machen und strcpy oder etwas anderes verwenden? –