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