Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Punteros en funciones c

Estas en el tema de Punteros en funciones c en el foro de C/C++ en Foros del Web. TEMA, tengo lo siguiente: char cad1[20] = "pepe"; char cad2[20] = "pepe2"; char **com = (char **)malloc (sizeof(char *)*2); com[0] = (char *)malloc (sizeof(char)*(strlen(cad1)+1)); com[1] ...
  #1 (permalink)  
Antiguo 27/11/2008, 06:02
 
Fecha de Ingreso: noviembre-2008
Mensajes: 5
Antigüedad: 15 años, 5 meses
Puntos: 0
Punteros en funciones c

TEMA, tengo lo siguiente:

char cad1[20] = "pepe";
char cad2[20] = "pepe2";

char **com = (char **)malloc (sizeof(char *)*2);

com[0] = (char *)malloc (sizeof(char)*(strlen(cad1)+1));
com[1] = (char *)malloc (sizeof(char)*(strlen(cad2)+1));

limpiarTabla(&com,1);


funcion limpiarTabla:

void limpiarTabla(char ***tabla,pos){

for ( ; pos >= 0 ; pos--) free ( *(tabla[pos]) );

free(*tabla);

}


PROBLEMA :
El caso es que al intentar limpiar la posicion 1 de la tabla, la funcion peta por violacion del segmento.

Mirando la direccion de los punbteros con [ printf ("%p",*(tabla+pos)); ]
me doy cuenta que el puntero en la direccion 1 de la tabla esta a nulo. ????????

Haber si alguien me podria explicar este caso, que escapa a mi saber.

GRACIAS.
  #2 (permalink)  
Antiguo 27/11/2008, 14:11
Avatar de define  
Fecha de Ingreso: enero-2008
Mensajes: 100
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Punteros en funciones c

com[0] = (char *)malloc (sizeof(char)*(strlen(cad1)+1));

no le aplices malloc a una posicion especifica.... porque eso es lo que produce la violacion de segmento, debes aplicarlo al puntero... (al menos es lo que recuerdo.. tengo un poco espeso el C, pero vamos :) estoy casi sguro de que es eso!, espero haberte sido de ayuda)
  #3 (permalink)  
Antiguo 28/11/2008, 02:27
 
Fecha de Ingreso: noviembre-2008
Mensajes: 5
Antigüedad: 15 años, 5 meses
Puntos: 0
Mensaje Respuesta: Punteros en funciones c

Ja tengo la solucion:

El problema esta aquí:

limpiarTabla(&com,1); // No se puede pasar la direccion de u puntero, ya que el puntero ya es una direccion.

Ade+ hay que dajar los punteros liverados a NULL.

Entronces el tema quedaria así:

limpiarTabla(com,1);


FUNCION LIMPIAR TABLA:

void limpiarTabla(char **tabla,pos){

for ( ; pos >= 0 ; pos--){
free ( tabla[pos] );
tabla[pos] = NULL;
}

free (tabla);
tabla = NULL;
}

GARCIAS POR EL INTERES.
  #4 (permalink)  
Antiguo 01/12/2008, 21:13
 
Fecha de Ingreso: febrero-2006
Mensajes: 49
Antigüedad: 18 años, 2 meses
Puntos: 1
Respuesta: Punteros en funciones c

Buenasss

Solo una cosita, en tu funcion limpiarTabla, el ultimo tabla = NULL estaría de más, porque lo que recibe una funcion es una copia del char **, el cambio no se va a mantener, esa variable automatica desaparece una vez que la funcion retorne, si queres que tabla quede seteada en NULL deberias hacer algo asi:

Código HTML:
void limpiarTabla(char *** tabla,pos)
{
    for ( ; pos >= 0 ; pos--)
    {
        free ( (*tabla)[pos] );
        (*tabla)[pos] = NULL;
    }

    free (*tabla);
    *tabla = NULL;
}
Saludos
  #5 (permalink)  
Antiguo 02/12/2008, 05:21
 
Fecha de Ingreso: noviembre-2008
Mensajes: 5
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Punteros en funciones c

Buenas:
Con respecto a lo que comntas PCKing.

Creo que no llevas razon , ya que no se pasa una copia de la variable tabla, sinó que es un puntero a una direccion de memoria donde empieza la cadena de caracteres (en es te caso).

Entonces este tipo de variables no les hace una copia, ya que se le pasa la direccion que ocupa en la memoria, entonces simplemente hay qye liberar esa direccion de memoria i listo.
  #6 (permalink)  
Antiguo 02/12/2008, 19:55
 
Fecha de Ingreso: febrero-2006
Mensajes: 49
Antigüedad: 18 años, 2 meses
Puntos: 1
Respuesta: Punteros en funciones c

Para modificar una variable tenes que enviar su direccion de memoria, si queres modificar tabla tenes que mandar &tabla en la invocación por ejemplo, hacé la prueba...
  #7 (permalink)  
Antiguo 03/12/2008, 04:50
 
Fecha de Ingreso: noviembre-2008
Mensajes: 5
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Punteros en funciones c

Yo creia que era así, como indico en mi primer posteo, pero no me funcionaba correctamente, ya que me perdía la dirección de memoria y me intentaba liberar una dirección nula.
  #8 (permalink)  
Antiguo 03/12/2008, 16:02
 
Fecha de Ingreso: febrero-2006
Mensajes: 49
Antigüedad: 18 años, 2 meses
Puntos: 1
Respuesta: Punteros en funciones c

Si, pero esa es porque pusiste mal los parentesis, nuestras dos funciones no son iguales fijate...

Código HTML:
void limpiarTabla(char ***tabla,pos){

for ( ; pos >= 0 ; pos--) free ( *(tabla[pos]) );

free(*tabla);

}

void limpiarTabla(char *** tabla,pos)
{
    for ( ; pos >= 0 ; pos--)
    {
        free ( (*tabla)[pos] );
        (*tabla)[pos] = NULL;
    }

    free (*tabla);
    *tabla = NULL;
}
free ( *(tabla[pos]) ); y la mia free ( (*tabla)[pos] );

Por eso te falla.

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:23.