prueba

Page 248

El lenguaje de programación C#

Tema 18: Código inseguro

class CopiaInsegura { public unsafe static void Main() { int[] tOrigen = new int[100]; int[] tDestino = new int[100]; fixed (int * pOrigen=tOrigen, pDestino=tDestino) { for (int i=0; i<100; i++) pOrigen[i] = pDestino[i]; } } }

Como puede deducirse del ejemplo, cuando se inicializa un puntero con una tabla, la dirección almacenada en el puntero en la zona <declaraciones> del fixed es la del primer elemento de la tabla (también podría haberse hecho pOrigen = &tOrigen[0]), y luego es posible usar la aritmética de punteros para acceder al resto de elementos a partir de la dirección del primero ya que éstos se almacenan consecutivamente. Al igual que tablas, también puede usarse fixed para recorrer cadenas. En este caso lo que hay que hacer es inicializar un puntero de tipo char * con la dirección del primer carácter de la cadena a la que se desee que apunte tal y como muestra este ejemplo en el que se cambia el contenido de una cadena “Hola” por “XXXX”: class CadenaInsegura { public unsafe static void Main() { string s=”Hola”; Console.WriteLine(“Cadena inicial: {0}”, s); fixed (char * ps=s) { for (int i=0;i<s.Length;i++) ps[i] = ‘A’; } Console.WriteLine(“Cadena final: {0}”, s); } }

La salida por pantalla de este último programa es: Hola AAAA

La ventaja de modificar la cadena mediante punteros es que sin ellos no sería posible hacerlo ya que el indizador definido para los objetos string es de sólo lectura. Cuando se modifiquen cadenas mediante punteros hay que tener en cuenta que, aunque para facilitar la comunicación con código no gestionado escrito en C o C++ las cadenas


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.