Bonjour,
je suis en train de programmer un terminal, en C. Je suis en train d’implémenter l’autocomplétition. Pour cela, j’ai créé une fonction commandeToStr qui prends une commande en argument et qui renvoie le texte que la commande renvoie. Je l’appelle par exemple comme cela :
1 2 3 4 5 | char* searchProg(char* lop, char* mot){ char ex[99999]; snprintf(ex, 99999, "echo '%s' | grep ^%s", lop, mot); return commandeToStr(ex); } |
Ou lop est la string contenant la liste des programmes, et mot un début de nom de programme.
Voici sa définition :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | char* commandeToStr(char* comm){ char* ret = 0; // Do not forget !! char buf[1024]; int sizeTot; int size; FILE* firstRes = popen(comm, "r"); while(fgets(buf, 1024, firstRes)) { size = strlen(buf); sizeTot = sizeTot + size; ret = realloc(ret, sizeTot); strcat(ret, buf); } return ret; } |
J’appelle cette fonction en commençant le nom d’un programme et je presse tab. La plupart du temps, cela marche bien. Mais quand je spam ’tab’, j’obtient forcément au bout d’un moment :
1 2 | a.out: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Abandon (core dumped) |
J’ai vu plusieurs personnes ayant eu le même problème sur le net, mais je n’ai pas trouvé de solution…
Merci d’avance !
+0
-0