elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pequeña duda sobre punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Pequeña duda sobre punteros  (Leído 3,268 veces)
PabloPbl

Desconectado Desconectado

Mensajes: 188


Ver Perfil
Pequeña duda sobre punteros
« en: 13 Diciembre 2015, 19:37 pm »

Se que si yo hago esto:
Código
  1. char *cadena = "Hola";
Se reserva una determinada cantidad de bytes en alguna parte de la memoria, en este caso, 4 bytes, por que son 4 caracteres.

Pero si ahora yo hago esto:
Código
  1. char *cadena = "Sol";
Se reservara 3 bytes mas para esta cadena, y acá mi pregunta:
¿Que pasa con los otros 4 bytes que reserve para la cadena "Hola", se reemplaza por estos?
Supongamos que se reemplaza, entonces, quedaría un byte libre, con la letra "a", ¿como haría para liberar ese espacio inútil? Ya que esta cadena solo ocupa 3 letras y sobraría 1, que había reservado anteriormente.
Espero me haya dado a explicar.

Mil gracias y espero me disculpen por molestar tanto, estoy estudiando C++ y me surgieron un montón de dudas y no las encontré en la web  :-\


En línea

fary
Moderador Global
***
Desconectado Desconectado

Mensajes: 1.020



Ver Perfil WWW
Re: Pequeña duda sobre punteros
« Respuesta #1 en: 13 Diciembre 2015, 19:58 pm »

No puedes declarar dos variables con el mismo nombre en la misma función  :xD

Si hubieras probado te habrías dado cuenta.



En línea

Un byte a la izquierda.
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Pequeña duda sobre punteros
« Respuesta #2 en: 13 Diciembre 2015, 20:52 pm »

A parte de lo que dice PabloPbl, con la primera cadena se reserva espacio para CINCO caracteres. El último carácter indica el fin de la cadena (equivale a 0). Por ejemplo, la declaración
Código
  1. char cadena[] = "Hola";
equivale a la declaración
Código
  1. char cadena[] = {'H', 'o', 'l', 'a', '\0'};
Si no se pusiera ese carácter, no sabríamos el final de la cadena.
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
0xFer


Desconectado Desconectado

Mensajes: 401



Ver Perfil
Re: Pequeña duda sobre punteros
« Respuesta #3 en: 13 Diciembre 2015, 21:14 pm »

Hola Pablo, cuánto tiempo sin hablar.

Citar
¿Que pasa con los otros 4 bytes que reserve para la cadena "Hola", se reemplaza por estos?

cadena al principio apunta a "Hola" en donde sea que esté el "H" pues allí es donde está apuntando, siempre que crees una cadena así como lo estás haciendo siempre se agrega un '\0' al final de la cadena( como ya te han dicho), es como si le dijeras al compilador que allí es donde termina la cadena. Ahora cuando haces que cadena apunte a "Sol" entonces la cadena "Hola" seguirá existiendo en la computadora, el problema es que ya no vamos a saber en dónde( al menos que con otro puntero guardes la dirección a la que apuntaba cadena al principio, cuando apuntaba a "Hola"), como ahora cadena apunta a "Sol" y como "Hola" aún sigue existiendo en la computadora pues cadena tendrá otra dirección de memoria.

Entonces al hacer esas asignaciones terminas perdiendo los punteros( quién sabe en dónde irán a terminar), luego creo que no se podrán liberar( el que se pierde, en este caso se pierde la dirección en donde se aloja "Hola", es como que un puntero no tiene memoria de las cosas a las que apunta, si lo cambias ya no se acordará de dónde apuntaba anteriormente).

Si es C++ entonces tienes a new y delete para manejar memoria dinámica, con eso como que te obligan a liberar la memoria cuando ya no lo estas utilizando, sino pues tienes que confiar a que la computadora libere la memoria( tipo java (xD)).

Ve fijándote en la dirección:

Código
  1.     char* cadena = "Hola";
  2.     printf("Dirección %d ",&(*cadena));
  3.  
  4.     cadena = "Sol";
  5.     printf("Dirección %d ",&(*cadena));

la dirección de cadena cambia. Luego también puedes guardar a "Hola" en otro puntero:

Código
  1.     char* cadena = "Hola";
  2.     char* cadena2 = cadena; //salvamos a cadena antes de cambiar a lo que apunta
  3.  
  4.     cadena = "Sol";
  5.  
  6.     printf("%s",cadena);
  7.     printf("%s",cadena2);

Ahora cuando el programa termine se libera cadena y cadena2 tranquilamente.
« Última modificación: 13 Diciembre 2015, 21:37 pm por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
PabloPbl

Desconectado Desconectado

Mensajes: 188


Ver Perfil
Re: Pequeña duda sobre punteros
« Respuesta #4 en: 13 Diciembre 2015, 23:54 pm »

Hola, muchas gracias a todos por la orientación, mas claro imposible  ;-)

Pero tengo una duda mas  :P

Si bien se que al hacer uso de esto, en una instrucción:
Código
  1. *puntero
Estoy obteniendo el valor de la dirección de memoria que se esta apuntando con el puntero.
Corrijanme si me equivoco.

Ahora quiero lograr obtener la dirección de memoria del valor que se esta apuntando con el puntero, me explico:

Código
  1. char *puntero = "Hola";

¿Como podría obtener la dirección de memoria en donde se encuentra el caracter "H"?

He intentado hacerlo así:
Código
  1. char *puntero = "Hola";
  2. cout << &(*puntero) << endl;

Pero lo único que hace es mostrarme la cadena entera, ¿por que pasa esto? ¿No se supone que me debería mostrar la dirección de memoria de lo que esta apuntando puntero?

Citar
Hola Pablo, cuánto tiempo sin hablar.
Hola Bro ;D si, anduve muy liado con los estudios(no me dejaban ni respirar).  >:(
Pero bueno, espero poder volver al grupo así hacemos algo, si es que siguen  :xD

Saludos.
En línea

0xFer


Desconectado Desconectado

Mensajes: 401



Ver Perfil
Re: Pequeña duda sobre punteros
« Respuesta #5 en: 14 Diciembre 2015, 00:09 am »

Cast a void*:

Código
  1. char *cadena = "Hola";
  2. cout << "Dirección: " << (void*)cadena << "\n";
  3.  

Lo de arriba sólo funciona en C, disculpa por eso.
« Última modificación: 14 Diciembre 2015, 00:12 am por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
mester

Desconectado Desconectado

Mensajes: 219


https://www.youtube.com/watch?v=IlY9C6pzxKc


Ver Perfil WWW
Re: Pequeña duda sobre punteros
« Respuesta #6 en: 24 Diciembre 2015, 01:25 am »

Al menos en C, para hacer esto:
Código
  1. char *cadena = "Hola";

Antes debes reservar memoria con alguna función como malloc o calloc:
Código
  1. char *cadena = (char *)calloc(5,sizeof(char));
  2. strcpy(cadena,"Hola");

Y por último con strcpy asignar a cadena una frase.

En línea

Justicia es dar a cada uno lo que se merece
Zekkk

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Pequeña duda sobre punteros
« Respuesta #7 en: 25 Diciembre 2015, 07:21 am »

Si tu haces:

Código:
char* cadena = "Hola";

No se reservan 4 bytes en alguna parte de la memoria. Se reservan 5 bytes(mas \0) en lo que se llama "stack" que es basicamente memoria eficiente y bastante limitada.

Cuando tu haces esto:

Código:
cadena = "Sol";

Que es lo que imagino que quisiste hacer, entonces has perdido la direccion donde esta "Hola" y tu puntero ahora apunta a "Sol" que son 4 bytes. Ahora, Sol no reemplaza a Hola de ninguna forma. Es decir, si crees que sucede esto "Sol\0a\0" te digo que eso no es lo que esta pasando, pero asumamos que es asi.

Entonces tenemos memoria que no nos sirve ocupando espacio y que debemos hacer para liberarla? Nada, porque fue reservada en el stack y la computadora maneja la memoria del stack por ti asi que no te preocupes por eso.

Ahora para elaborar un poco mas la respuesta de tu pregunta original y de paso responder la segunda tenemos que entender como se reserva la memoria en el stack. Supongamos que tenemos tu codigo original:

Código:
char* cadena = "Hola";

y la direccion de la memoria donde se encuentra H es 4195924 . Hola ocupa 5 bytes entonces el char final del string "Hola" esta en 4195929(que es \0). Ahora supongamos que tenemos:

Código:
cadena = "Sol";

Y la memoria es 4195949, entonces si haces
Código:
printf("%s", cadena - 20);
lo que veas deberia ser Hola.

Para obtener la direccion de la memoria tienes que recordar que se trata de un numero. Entonces
Código:
printf("%d", cadena);
te da la direccion de la memoria. El estilo para hacerlo en C++ seria:
Código:
std::cout << (int)cadena;
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.902


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Pequeña duda sobre punteros
« Respuesta #8 en: 25 Diciembre 2015, 13:50 pm »

nonpromisc: si se puede hacer eso, son literales de cadena.

Zekkk: no van en la pila (si el puntero en si mismo si es una variable local) sino en la sección de datos de solo lectura, por eso si tratas de escribir en ellos se produce una excepcion no controlada.

Código
  1. #include <cstdio>
  2.  
  3. void main()
  4. {
  5.    //char cadena[] = "Hola"; //esto si va en la pila
  6.    char *cadena = "Hola";
  7.    *cadena = 'B'; //kaboom
  8.    printf(cadena);
  9. }
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
MAFUS


Desconectado Desconectado

Mensajes: 1.572



Ver Perfil
Re: Pequeña duda sobre punteros
« Respuesta #9 en: 25 Diciembre 2015, 15:03 pm »

Cintunuando con la explicación de Eterna Idol, decir que una forma de poner en la pila una cadena es mediante el uso de arrays de carácteres:

Código
  1. char str[] = "Una cadena";

Siempre y cuando str sea una variable local. En este caso C crea espacio en la pila y genera el código para copiar 'Una cadena' en ese espacio reservado, mas un caracter nulo, con lo que 'Una cadena' no existe en otro sitio que el archivo fuente de C.

Pero no se puede definir de la manera siguiente
Código
  1. char str[];
  2. str = "Una cadena";

Por el hecho de que str es un puntero estático, no puede apuntar a otro sitio, y ahora "Una cadena" es una constante que se guarda en la zona de memoria de solo lectura. C no genera codigo para copiar el valor sino que interpreta que se quiere que str apunte a la cadena, lo que es ilegal.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda sobre punteros
Ejercicios
maryrisas 1 3,083 Último mensaje 23 Febrero 2006, 17:59 pm
por [[JONAS]]
Pequeña duda sobre WMI
Programación Visual Basic
ŞCØRPIØN-X3 2 1,633 Último mensaje 13 Mayo 2011, 04:58 am
por ŞCØRPIØN-X3
Duda sobre punteros
Programación C/C++
adissenys 3 1,569 Último mensaje 17 Noviembre 2012, 22:59 pm
por Ferno
Pequeña duda con punteros
Programación C/C++
JonaLamper 1 967 Último mensaje 28 Febrero 2015, 13:09 pm
por xiruko
Duda sobre punteros en C
Programación C/C++
mester 4 2,250 Último mensaje 29 Julio 2015, 22:46 pm
por mester
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines