Ours avec moi. Je n'ai pas codé en c depuis 8 ans et je suis totalement déconcerté pourquoi ma manipulation de chaînes ne fonctionne pas. J'écris un programme qui boucle pour toujours. Dans la boucle, j'initialise deux pointeurs de char, chacun étant passé à une fonction qui ajoute du texte au pointeur char (tableau). Lorsque les fonctions sont terminées, j'imprime le pointeur char et libère les deux pointeurs char. Toutefois, le programme meurt après 7 itérations avec le message d'erreur suivantrealloc et causes libres "double gratuit ou corruption"
* 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(<);
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");
}
}
reformate s'il vous plaît :) – KevinDTimm
@Kevin, comme vous le souhaitez. –
pourquoi allouez-vous chaque fois à travers la boucle plutôt que d'allouer et de réutiliser la mémoire à l'avance? –