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

Cadenas con punteros en ves de arreglo, ¿por qué se puede?

Estas en el tema de Cadenas con punteros en ves de arreglo, ¿por qué se puede? en el foro de C/C++ en Foros del Web. Hola!! Una ves leei que en ves de hacer esto: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C: Ver original char a [ 10 ] ; gets ( a ...
  #1 (permalink)  
Antiguo 19/10/2012, 21:52
 
Fecha de Ingreso: julio-2009
Mensajes: 36
Antigüedad: 15 años, 5 meses
Puntos: 0
Cadenas con punteros en ves de arreglo, ¿por qué se puede?

Hola!!
Una ves leei que en ves de hacer esto:

Código C:
Ver original
  1. char a[10];
  2. gets(a);
  3. //etc etc

Se podia hacer esto:

Código C:
Ver original
  1. char *a;
  2. gets(a);
  3. //etc etc

Y la verdad no recuerdo el porqué y también recuerdo algo de una limitación al momento de querer editar, o usar otro gets(a); después del primero en algún momento, ¿alguien me lo podría explicar?. (el porqué funciona y el porqué de la limitación)
Gracias.
(Se punteros, memoria dinámica y lo suficiente, incluso recuerdo que lo entendí cuando lo leei pero ya no me acuerdo que fue xD)... xD
  #2 (permalink)  
Antiguo 20/10/2012, 06:35
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Cadenas con punteros en ves de arreglo, ¿por qué se puede?

"...recuerdo que lo entendí cuando lo leei pero ya no me acuerdo..."

Vuelve a leer el manual y veras que la cosa no funciona asi :)

Un puntero aun cuando ocupa 4 bytes por defecto no apunta a ninguna direccion de memoria, esto significa que compilaras el codigo porque no hay errores de sintaxi pero al ejecutar provocaras un desbordamiento de bufer.

Sabiendo que los caracteres ocupan 1 byte puedes referenciar a traves de 'char *' cualquier direccion de memoria para guardar el nº de caracteres igual al tamaño del bloque referenciado:

Código:
    char *a;
    int b;
    
    a = (char*)&b;
    gets(a);
    printf("%s", a);
En este ejemplo 'b' tiene asignado un bloque de memoria de 4 bytes (tipo int), al referenciar 'b' a traves de 'a' puedes trabajar sobre 'a' hasta un maximo de sizeof(int) bytes, que en el caso de char equivalen a caracteres.

Y respondiendo a tus preguntas:

"...por que funciona..."
No funciona, es sintacticamente correcto pero en la practica produce un BOF

"...porqué de la limitación..."
La limitacion sirve para que funcione tanto a nivel de sintaxi como a nive practico; la limitacion es que solo funcionará cuando esté referenciando un bloque de memoria asignado al proceso, por lo que no es una limitacion sino que es la unica forma de uso.

Siguiendo tu codigo: 'char a[10]' esta declarando una variable que tiene asignado un bloque de memoria de 10 bytes dentro del proceso, en cambio 'char *a' no tiene asignado ninguna direccion de memoria, el BOF se producirá igual cuando intentes guardar algo en '*a' como cuando intentes guardar >10 byes en 'a'.

Saludos
vosk
  #3 (permalink)  
Antiguo 20/10/2012, 12:24
 
Fecha de Ingreso: julio-2009
Mensajes: 36
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Cadenas con punteros en ves de arreglo, ¿por qué se puede?

Exacto, bueno gracias y creo que necesito aprender a redactar xD

Etiquetas: cadenas, funcion, punteros, ves, arreglos
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 07:09.