2009-12-10 29 views
15

Estoy esperando que los dos siguientes vectores tienen la misma representación en la memoria RAM:C - ¿Diferencia entre "char var []" y "char * var"?

char a_var[] = "XXX\x00"; 
char *p_var = "XXX"; 

Pero extraño, una llamada a una función de biblioteca de tipo f(char argument[]) crushs la aplicación en ejecución, si lo llamo usando f(p_var). ¡Pero usar f(a_var) está bien!

¿Por qué?

Respuesta

26

La primera crea una matriz de caracteres que contiene la cadena. El contenido de la matriz se puede modificar. El segundo crea un puntero de carácter que apunta a un literal de cadena. Los literales de cadena no se pueden modificar.

+0

Como sé, en ANSI C todos pueden modificarse – psihodelia

+15

Usted sabe incorrecto. El estándar prohíbe modificaciones de literales de cadenas. –

+0

Ok, gracias! Ahora, lo recordaré para siempre :) – psihodelia

1

Supongo que la función f modifica el contenido de la cadena que se le pasa.

+0

sí, modifica. pero ¿por qué f (p_var) hace crush y f (a_var) no? – psihodelia

+1

porque: char * p_var = "XXX"; No se puede modificar. –

0

Las matrices se pueden tratar (generalmente) como punteros, pero eso no significa que sean siempre intercambiables. Como dijo el otro, tu p_var apunta a un literal, algo estático que no se puede cambiar. Puede señalar otra cosa (por ejemplo, p_var = & a_var [0]) pero no puede cambiar el valor original que especificó mediante comillas ....

Un problema similar ocurre cuando se define una variable como una array en un archivo, y luego extern-use como un puntero.

Saludos

1

Como otros han dicho, char *p_var = "XXX"; crea un puntero a una cadena literal que no se puede cambiar, por lo que las implementaciones del compilador son libres de volver a utilizar literales, por ejemplo:

char *p_var = "XXX"; 
char *other = "XXX"; 

Un compilador podría elija optimizar esto al almacenar "XXX" solo una vez en la memoria y hacer que ambos punteros lo apunten, modificar su valor podría generar un comportamiento inesperado, por lo que no debería tratar de modificar sus contenidos.

Cuestiones relacionadas