C – ¿Diferencia entre “char var ” y “char * var”?

Estoy esperando que ambos vectores siguientes tengan la misma representación en la RAM:

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[]) aplasta la aplicación en ejecución si la llamo usando f(p_var) . ¡Pero usar f(a_var) está bien!

¿Por qué?

El primero crea una matriz de char 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.

En una suposición, la función f modifica el contenido de la cadena que se le pasa.

Como otros dijeron, char *p_var = "XXX"; crea un puntero a un literal de cadena que no se puede cambiar, por lo que las implementaciones del comstackdor pueden reutilizar literalmente, por ejemplo:

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

Un comstackdor podría optar por optimizar esto almacenando “XXX” solo una vez en la memoria y haciendo 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.

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 define una variable como una matriz en un archivo y luego la usa de forma externa como un puntero.

Saludos