2011-04-13 7 views

Respuesta

4

El primer ejemplo es un char * a un literal de caracteres (un literal es "something"). Los literales de caracteres son de solo lectura e intentar escribirlos puede provocar bloqueos. Su primer puntero debería ser realmente const char *f = "abcdef";, que strcpy no tomará.

5

En el primer ejemplo, tiene un puntero a un literal de cadena. Este puntero debería ser realmente const char *, porque cualquier intento de modificar un literal de cadena es un comportamiento indefinido. Sin embargo, por razones de legado le permite usar un char * para señalarlo. Pero todavía no deberías estar tratando de modificarlo.

En la segunda versión, tiene una matriz estándar de pantano, cuyos contenidos se inicializan para ser equivalentes a su cadena. Esto es modificable, ya que es su matriz.

11

"abcdef" y "ddd" son literales de cadena que pueden residir en una sección de solo lectura de su espacio de direcciones. char s[] = "ddd" garantiza que este literal se copie a la pila, por lo que es modificable.

+0

Ahh, gracias eso tiene mucho sentido. –

+0

@JohnSmith marca como correcto? –

2

La declaración char * f = "abcdef" asigna un punto en la memoria de la cadena literal "abcdef", sin embargo, se niegan a dejar que modifique su contenido hasta que la memoria se asigna dinámicamente - es equivalente a un const char.
Todo lo que estamos haciendo es crear un puntero en la memoria y luego escribir en los próximos 6 bytes, que es ilegal en C.

0

Usted, se refieren a this enlace

, para saber cómo usar strcpy char punteros.

6

char * f = "abcdef"; define un puntero char a "abcdef" que se encuentra en el área de sólo lectura por lo que no se puede escribir en este lugar

char s[] = "ddd"; define una matriz de caracteres en la pila el que se puede escribir.

2

Los literales de cadena son considerados de solo lectura por la mayoría de los compiladores, por lo que la memoria donde residen se puede marcar como de solo lectura, lo que da como resultado un error de tiempo de ejecución.

para hacer que funcione, haga lo siguiente:

char * f = strdup("abcdef"); 
strcpy(f, "abcdef"); 
printf("%s",f); 
free(f); 

Esto crea una copia modificable de la cadena en la memoria de almacenamiento dinámico, que debe quedar liberada al final de su programa, por supuesto.

Cuestiones relacionadas