[C con Clase] Cadenas en char*

Davidson, Steven srd4121 en njit.edu
Vie Abr 25 05:33:25 CEST 2014


Hola Facundo,

2014-04-24 18:57 GMT-04:00 Facundo Curti <facu.curti en gmail.com>:

> Hola gente. Hace un tiempo que sigo la lista, pero este es mi primer
> mensaje. :) La cuestión es que tengo una duda sencilla y corta jaja.
>
>
Bienvenido (con retraso) :)

Yo tenia entendido, que al guardar una cadena en un char*, se podrían
> pisar datos de otras variables. Sin embargo un amigo me dice que no.
> ¿Alguien podría desempatarnos? jaja. Y sobre todo saber el por que
> pasa o no pasa esto.
>

Depende de las operaciones que manejan tal cadena o el mismo puntero. Por
ejemplo,

char *psz = new char[5];

psz[0] = 'H';
psz[1] = 'o';
psz[2] = 'l';
psz[3] = 'a';
psz[4] = '\0';

Aquí no pisamos a nadie; pero si hacemos esto:

psz[5] = '9';

entonces ya estamos accediendo a memoria que realmente no nos pertenece. El
sistema operativo puede denegarnos el acceso - tanto si es de lectura como
si es de escritura.

Ahora bien, a veces nos interesa rebasar el tamaño original. Por ejemplo,
usando 'malloc()',

struct Array
{
  int nCantidad;
  int aEnteros[1];
};

Array *pLista = (Array *) malloc( sizeof(Array) + 31*sizeof(int) );

pLista->nCantidad = 32;
pLista->aEnteros[0] = -93;

Ahora podemos acceder a varios enteros más allá del primero; por ejemplo,

pLista->aEnteros[1] = 198;
pLista->aEnteros[2] = -443;
...

Podemos rebasar el índice de 0 (cero) porque creamos dinámicamente una
cantidad mayor de memoria para 'Array': hemos creado memoria para 'Array' y
para 31 enteros más. Y así, aprovechamos el hecho de que podemos rebasar el
array. Obviamente, podemos hacer esto, porque previamente garantizamos que
la memoria accedida fuese adjudicada a nuestro programa.

En general, tienes que garantizar que la memoria que vayas a acceder debe
estar reservada al programa.


Espero que esto te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140424/9167fbfb/attachment.html>


Más información sobre la lista de distribución Cconclase