Estoy peleándome con los punteros, intento hacer una función (aunque de momento es un progama para no liarme) que haga algo similar a lo que devuelve argv, es decir, que divida una orden en varias cadenas, cada una apuntada por un puntero distinto para poderlas referenciar mediante los corchetes (Ej: orden[0],orden[1])
Quiero hacerlo para cualquier número de palabras, por lo que uso memoria dinámica, para dividir la orden uso strtok y su comportamiento es correcto, el problema lo tengo a la hora de manejar los punteros:
En **resul, voy reservando memoria con realloc para los punteros que apuntan a cada palabra, por tanto, mientras haya tokens hago lo siguiente:
- Aumento el tamaño de resul
- Reservo memoria para el puntero al token
- Le asigno el token
Código:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
char linea[] = "send UDP 4500 50";
char **resul=NULL;
int numTokens,conta2;
char *sep=" ";//caracter separador de las ordenes
int conta=0; //contador de número de tokens encontrados
char *saveptr,*token;
for(token=strtok_r(linea,sep,&saveptr); token!=NULL; token=strtok_r(NULL,sep,&saveptr)){
printf("token: %s\n",token);
printf("Tamaño: %i\n",(conta+1)*sizeof(char*));
resul = (char **)realloc(resul,(conta+1)*sizeof(char*)); //Aumentar tamaño para el array de punteros
resul[conta]= malloc(sizeof(char*)); //Reservar tamaño para el puntero
resul[conta]=token; //Asignar palabra al puntero
conta++;
}
//Imprimir resultados
for(conta2=0;conta2<conta;conta2++)
printf("resul: \"%s\"\n",resul[conta2]);
//Liberar memoria
for(conta2=0;conta2<conta;conta2++){
printf("liberando: %i\n",conta2);
free(resul[conta2]);
}
free(resul);
return(0);
}
La salida al ejecutarlo es:
Código:
$ ./lectura_consola
token: send
Tamaño: 4
token: UDP
Tamaño: 8
token: 4500
Tamaño: 12
token: 50
Tamaño: 16
resul: "send"
resul: "UDP"
resul: "4500"
resul: "50"
liberando: 0
*** glibc detected *** ./lectura_consola: free(): invalid pointer: 0xbffb7f1b ***
Si lo arranco con valgrind para ver los fallos de memoria cuando va a hacer free(resul[0]) dice lo siguiente:
Código:
liberando: 0
==8372== Invalid free() / delete / delete[]
==8372== at 0x40257ED: free (vg_replace_malloc.c:366)
==8372== by 0x80489FA: main (lectura_consola.c:92)
==8372== Address 0xbee8e28b is on thread 1's stack
Por otro lado al intentar pasar esto a una función, también me daba problemas, pero eso lo dejo para más adelante, de momento a ver si puedo arreglar esto con vuestra ayuda.