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

Dudas con punteros char.

Estas en el tema de Dudas con punteros char. en el foro de C/C++ en Foros del Web. Buenas, hacía bastante que no hacia nada en C y la verdad es que me han salido un par de dudas. La primera es: Cuando ...
  #1 (permalink)  
Antiguo 28/08/2013, 09:13
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Dudas con punteros char.

Buenas, hacía bastante que no hacia nada en C y la verdad es que me han salido un par de dudas.

La primera es: Cuando yo hago una declaración como:
Código C:
Ver original
  1. char *p = "Hola";
Que es lo que hace exactamente el compilador? Quiero decir, se crea un puntero char y también se reserva un espacio de memoria para "Hola", es así? Esto ahorra la llamada a malloc o hace otra cosa?

La segunda es: Cuando creo una función como:
Código C:
Ver original
  1. void a(char * msg)...
Y luego la llamo, que hace el compilador con esa cadena que yo pongo en la función? Lo pone en el stack de la propia función? O hace alguna cosa diferente, y crea la memoria como en la pregunta 1?

Gracias.
  #2 (permalink)  
Antiguo 28/08/2013, 11:06
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Dudas con punteros char.

Primer punto: Se guarda de la misma forma en la que se guardan los numeros en las operaciones:

Código C:
Ver original
  1. cosa = cosa+2-4*cosa;

Los números 2 y 4 se guardan en el programa como datos constantes, con la cadena char pasa lo mismo ;).

Cabe destacar una cosa, no es lo mismo poner:

Código C:
Ver original
  1. char *p = "Hola";

Que poner:

Código C:
Ver original
  1. char p[] = "Hola";

El primero es un puntero que apunta a un valor constante (lo que hemos dicho antes). El segundo crea un array que guarda la cadena puesta a continuación.

Segundo punto: Se copia el puntero char*, esto se puede ver de la siguiente forma:

Código C:
Ver original
  1. char Cosa[] = "Hola";
  2.  
  3. Funcion(Cosa);
  4.  
  5. printf("%s",Cosa);
  6.  
  7. /...
  8.  
  9. void Funcion(char* Cosa)
  10. {
  11.    Cosa[2] = 'z';
  12. }

Se hace una copia del puntero, pero se apunta a la misma cadena. De modo que los cambios que se hagan en la funcion se ven fuera de la función.
  #3 (permalink)  
Antiguo 28/08/2013, 11:23
Avatar de L3m0n  
Fecha de Ingreso: diciembre-2011
Mensajes: 219
Antigüedad: 12 años, 3 meses
Puntos: 46
Respuesta: Dudas con punteros char.

Vamos a ver si lo entiendo bien, osea la primera se guardan como datos que no se pueden modificar y reciben una dirección de memoria para todo el programa hasta que uno haga free?

La segunda creo que no me expliqué bien, la pregunta era más bien que pasa cuando yo llamo a la función haciendo algo así:
Código C:
Ver original
  1. Funcion("hola..");
Que pasaría en ese caso, donde se guarda ese "hola"?

Gracias.
  #4 (permalink)  
Antiguo 28/08/2013, 11:47
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Dudas con punteros char.

Cita:
Iniciado por L3m0n Ver Mensaje
Vamos a ver si lo entiendo bien, osea la primera se guardan como datos que no se pueden modificar y reciben una dirección de memoria para todo el programa hasta que uno haga free?
No puedes hacer free en esa dirreción de memoria porque no ha sido reservada dinamicamente, es como si hicieras free en esto:

Código C:
Ver original
  1. int Cosa;
  2.  
  3. int* Puntero = &Cosa; // Dirrecion de la variable cosa
  4.  
  5. free(Puntero); // ¡ERROR!

Cita:
Iniciado por L3m0n Ver Mensaje
La segunda creo que no me expliqué bien, la pregunta era más bien que pasa cuando yo llamo a la función haciendo algo así:
Código C:
Ver original
  1. Funcion("hola..");
Que pasaría en ese caso, donde se guarda ese "hola"?

Gracias.
La cadena "hola..." es un valor constante como ya hemos dicho anteriormente, simplemente se coje su dirrecion y se pasa a la función (el compilador hace ese trabajo por ti).

Etiquetas: dudas, punteros
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 22:12.