Estoy tratando de devolver una matriz de cadenas de una función y luego liberar la memoria que usó. El código está abajo:
int main(int argc, const char * argv[]) { for (int m = 0; m < 10000; m++) { char **data = dataTest(); int i = 0; while(data[i]) { printf("%p ",data[i]); free(data[i]); i++; } printf(" address= %p.\n",data); free(data); } return 0; }Aquí está la función:
char **dataTest() { char *row[] = {"this", "is", "a", "data", "string", NULL}; char **str = row; char **dataReturn = (char **) malloc(sizeof(char *) * 6); int i = 0; while (*str) { dataReturn[i] = malloc(sizeof(char) * strlen(*str)); strcpy(dataReturn[i++], *str); str++; } return dataReturn; }Funciona bien al principio, pero pronto se produce el error. A continuación se muestra el resultado. La dirección sale mal de alguna manera y ocurre el error malloc. ¿Alguien se ha encontrado con el mismo problema antes?
0x100300030 0x100300040 0x100300050 0x100300060 0x100300070 dirección = 0x100300000. 0x100300030 0x100300040 0x100300050 0x100300060 0x100300070 dirección = 0x100300000. 0x100400030 0x100300030 0x100300040 0x100300050 0x100300060 dirección = 0x100400000. testC(562,0x7fff73e71310) malloc: *** error para el objeto 0x3000000000000: el puntero que se está liberando no se asignó *** establece un punto de interrupción en malloc_error_break para depurar 0x100300060 0x100300070 0x100300030 0x100300040 0x100300050 0x3000000000000 Programa finalizado con código de salida: 9
Debe agregar esto justo antes de return dataReturn; en su función de dataTest de datos:
dataReturn[i] = NULL ; de lo contrario, su while (data[i]) {} continuará más allá de lo deseado.
Y en lugar de:
dataReturn[i] = malloc( sizeof(char) * (strlen(*str)) );escribe:
dataReturn[i] = malloc(strlen(*str) + 1);con el fin de asignar espacio para el cero de terminación.
Por cierto, el tamaño de sizeof (char) es siempre 1.