Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/10/2012, 06:35
vosk
 
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