2017-01-07 1 views
-1

la fonction obtenir une sentnce et doit remplacer entre les «n» premiers mots. quand il s'agit de la première realloc l'arrêt du programme et l'erreur affichée. J'essaie beaucoup de combinaison de phrases, la nouvelle memmory que je demande est plus grande que la mémoire existe.Erreur lors de realloc dans c (exception trown (ucrtbased.dll))

ma fonction:

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

Quelle erreur avez-vous trouvé? –

+0

Sauf si vous savez vraiment ce que vous faites, allouer juste assez d'espace avec 'strlen (x)' est trop court. – usr2564301

Répondre

2

Prenez de plus près ces deux lignes:

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

Dans la première vous allouez la mémoire et faire temp points à cette mémoire. Dans la ligne suivante, vous réaffectertemp pour pointer ailleurs.

Vous faites cela pour vos réaffectations.

Notez également qu'en effectuant, par ex.

sentence[m] = sentence[n]; 

vous copiez un pointeur et non le contenu de la mémoire du pointeur pointe. C'est une copie peu profonde. Si vous corrigez ceci pour copier le contenu réel (et avoir une copie profonde) alors vous devez vous rappeler que les chaînes dans C sont terminées par un caractère supplémentaire non compté par strlen. Par exemple, la chaîne "hello" est en réalité six caractères avec le terminateur. Vous devez également allouer de l'espace pour ce terminateur.

+0

donc en fait je dois le faire (strlen (x) +1) et utiliser strcpy ou autre chose? –