Ok ho fatto dei miglioramenti anche riscrivendo il codice e ordinandolo un pò:Righe come queste
ret[elem -1] = (char *)malloc(strlen(tmp) * sizeof(char));
ret[elem -1] = tmp;
non hanno senso. Assegni due valori diversi uno dopo l'altro allo stesso elemento, creando un memory leak ...
Però mi assegna solo il primo elemento (100), gli altri se li mangia... penso di fare casino con il free e l'assegnazione di NULL.codice:#include <string.h> #include <stdio.h> #include <stdlib.h> char **explode(char sep, char *str); int main (void) { int i, i2; char **new; new = explode(',', "100,2,3,4,5,6,7,8,9,"); printf("%s ", new[0]); printf("%s ", new[1]); return 0; } char **explode(char sep, char *str) { int elem = 0 , i = 0 , i2; char *tmp = NULL , **ret = NULL; ret = (char **)malloc(sizeof(char **) * (strlen(str))); for (; i < strlen(str); i++) { if (*(str + i) == sep || *(str + i) == '\n') { printf("\n- %s\n", tmp); ret[elem] = (char *)malloc(sizeof(char) * (strlen(tmp))); for (i2 = 0; i2 < strlen(tmp); i2++) { ret[elem][i2] = tmp[i2]; } elem++; free(tmp); tmp = NULL; } else { /* Se è il primo ciclo alloca, altrimenti re-alloca uno spazio più grande */ if (tmp != NULL) tmp = (char *)realloc(tmp, sizeof(char) * (strlen(tmp) + 1)); else tmp = (char *)malloc (sizeof(char) * 1); tmp[i] = *(str + i); } } free(tmp); printf("\nElementi: %d\n", (elem + 1)); return ret; }

Rispondi quotando