C - Difference between "char var[]" and "char *var"?

I am expecting that both following vectors have the same representation in RAM:

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

But strange, a call to a library function of type f(char argument[]) crushs the running application if I call it using f(p_var). But using f(a_var) is Ok!

Why?


The first creates an array of char containing the string. The contents of the array can be modified. The second creates a character pointer which points to a string literal. String literals cannot be modified.


At a guess, the function f modifies the contents of the string passed to it.


As others said, char *p_var = "XXX"; creates a pointer to a string literal that can't be changed, so compiler implementations are free to reuse literals, for example:

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

A compiler could choose to optimize this by storing "XXX" only once in memory and making both pointers point to it, modifying their value could lead to unexpected behavior, so that's why you should not try to modify their contents.