[C con Clase] Cadenas en char*

Facundo Curti facu.curti en gmail.com
Vie Abr 25 06:41:56 CEST 2014


El día 25 de abril de 2014, 0:33, Davidson, Steven <srd4121 en njit.edu> escribió:
> 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
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

Gracias por la respuesta! Me has aclarado mucho! :)

Y si hago:

char* cadena = "Hola mundo"

Se reservan automáticamente las 12 posiciones en memoria? O tengo que
antes haber definido el tamaño con el new?




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