Question

Ours avec moi. Je n'ai pas codé en C en 8 ans et je suis tout à fait déconcerté pourquoi ma manipulation de chaîne ne fonctionne pas. Je suis en train d'écrire un programme qui boucle pour toujours. Dans la boucle, j'initialiser deux pointeurs char chacun est passé à une fonction qui ajoute du texte au pointeur de char (tableau). Lorsque les fonctions sont faites imprimer le pointeur char et libérez les deux pointeurs char. Cependant les matrices de programme après 7 itérations avec le message d'erreur suivant de

  

* glibc détecté * ./test: double libération ou la corruption (fasttop): 0x0804a168 ***

#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include string.h
#include stdio.h
#include stdlib.h
#include errno.h
#include time.h

char *SEPERATOR = "|";

void getEvent (char* results);
void getTimeStamp(char* timeStamp, int timeStampSize);
void stringAppend(char* str1, char* str2);

int main (int argc, char *argv[])
{
  int i = 0; 
  while(1)
  { 
    i++;
    printf("%i", i);    

    char* events= realloc(NULL, 1); 
    events[0] = '\0';
    getEvent(events);

    char* timestamp= realloc(NULL, 20);
    timestamp[0] = '\0';
    getTimeStamp(timestamp, 20);

    printf("%s", events);
    printf("timestamp: %s\n", timestamp);

    free(events);
    free(timestamp);
  } 
}

void getEvent (char* results)
{
  stringAppend(results, "a111111111111");
  stringAppend(results, "b2222222222222");
}

void getTimeStamp(char* timeStamp, int timeStampSize)
{
  struct tm *ptr;
  time_t lt;
  lt = time(NULL);
  ptr = localtime(&lt);
  int r = strftime(timeStamp, timeStampSize, "%Y-%m-%d %H:%M:%S", ptr);
}

void stringAppend(char* str1, char* str2)
{   
  int arrayLength = strlen(str1) + strlen(str2) + strlen(SEPERATOR) + 1;
  printf("--%i--",arrayLength);

  str1 = realloc(str1, arrayLength);
  if (str1 != NULL)
  {
    strcat(str1, SEPERATOR);
    strcat(str1, str2);
  }
  else
  {
    printf("UNABLE TO ALLOCATE MEMORY\n");
  }
}
Était-ce utile?

La solution

Le problème est que tout stringAppend réaffecte les pointeurs, ne stringAppend est au courant de ce fait. Vous devez modifier stringAppend prendre pointeur à des pointeurs (char **) de sorte que les pointeurs originaux sont mis à jour.

Autres conseils

Vous réaffecte str1 mais pas passer la valeur de votre fonction, de sorte que le pointeur potentiellement modifié est une fuite, et l'ancienne valeur, qui a été libéré par realloc, est à nouveau libéré par vous. Cela provoque l'avertissement "double libre".

Cette ligne stringAppend:

str1 = realloc(str1, arrayLength);

change la valeur d'une variable locale dans stringAppend. Cette variable locale appelée str1 maintenant des points à la mémoire soit réaffectées ou NULL.

En attendant les variables locales dans GetEvent garder les valeurs qu'ils avaient avant, qui maintenant habituellement de déterminer la mémoire libérée.

Tous les commentaires où très utile. Bien sûr, il est logique totale pourquoi l'erreur se passait. J'ai fini par résoudre en apportant les modifications suivantes.

Pour les deux GetEvent et stringAppend je retourne le pointeur char.

par exemple.

char* stringAppend(char* str1, char* str2) 
{    
  int arrayLength = strlen(str1) + strlen(str2) + strlen(SEPERATOR) + 1; 
  printf("--%i--",arrayLength); 

  str1 = realloc(str1, arrayLength); 
  if (str1 != NULL) 
  { 
    strcat(str1, SEPERATOR); 
    strcat(str1, str2); 
  } 
  else 
  { 
    printf("UNABLE TO ALLOCATE MEMORY\n"); 
  } 
  return str1;
} 

Ce n'est pas une réponse à votre question (et vous ne pas besoin, puisque l'erreur a été signalée), mais j'ai d'autres commentaires au sujet de votre code:

char* events= realloc(NULL, 1); 
events[0] = '\0';

Vous ne testez pas que realloc mémoire allouée avec succès.

char* timestamp= realloc(NULL, 20);
timestamp[0] = '\0';

Même problème ici. Dans ce cas, vous n'avez pas besoin realloc du tout. Comme il est un tampon de taille fixe, vous pouvez utiliser simplement:

char timestamp[20] = "";

Et ne pas faire ceci:

str1 = realloc(str1, arrayLength);

parce que si ne realloc, vous orphelin la mémoire qui str1 pointait auparavant. Au lieu de cela:

char* temp = realloc(str1, arrayLength);
if (temp != NULL)
{
    str1 = temp;
    ...
}

Notez que depuis que vous modifiez stringAppend pour retourner la nouvelle chaîne, vous devez faire des contrôles similaires dans les fonctions d'appel.

En outre, "séparateur" est écrit avec deux As, pas avec deux Es.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top