Hola, Jerónimo;

Jeronimo escribió:
Me parece que es asi

int main ()
{
   char *s[] = {"holas", " " , "mundo"};
   //s[0][4] = 0; /* Esta linea pone el \0 en lugar de la s de holas */
   *(s[0] + 4) = 0;

No; esto y lo de arriba es exactamente lo mismo; el operador a[b] es azucar sintáctica para la expresión *(b + a) (es más, incluso funciona si le ponés 0[s], ni tipos chequea). Como bien contestó Gonzalo, eso no se puede hacer porque la memoria esa es de sólo lectura. Las cadenas definidas entre comillas son de memoria estática, salvo que hagas una copia en una memoria pedida especialmente (sea stack, como en el ejemplo de Gonzalo, o sea en el heap con memoria dinámica). El compilador aprovecha esta particularidad para que siempre que se invoque a esa cadena sea la misma posición de memoria y ahorrarse la copia. Por ejemplo;

   printf("%s%s%s",s[0], s[1], s[2]); /* Debería imprimir hola mundo */
   return 0;

Si más adelante tuvieras otro printf("%s%s%s", ...) podrías comprobar que ambas veces se utilizó la misma dirección para la representación de la cadena "%s%s%s". Esto no sería viable si la misma fuera escribible.
        Saludos;

Sebastián Santisi
[EMAIL PROTECTED]

}

Fijate si la direccion a la cual estas accediendo con s[0][4] esta contenida dentro de los strings apuntados por *s[]

Saludos
Jerónimo
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a