我期望以下两个向量在RAM中有相同的表示:
char a_var[] = "XXX\x00";
char *p_var = "XXX";
但很奇怪,如果我使用 f(p_var)
来调用类型为 f(char argument[])
的库函数,应用程序就会崩溃。但是使用 f(a_var)
是可以的!
为什么?
第一个创建了一个包含字符串的字符数组。该数组的内容可以被修改。第二个创建了一个指向字符串字面量的字符指针。字符串字面量是不可修改的。
根据推测,函数f
修改了传递给它的字符串的内容。
数组通常可以被视为指针,但这并不意味着它们总是可以互换使用。正如其他人所说,您的p_var指向一个文字常量,即静态的、无法更改的内容。它可以指向其他内容(例如p_var = &a_var[0]),但您无法更改通过引号指定的原始值....
类似的问题出现在您在一个文件中将变量定义为数组,然后在另一个文件中以指针形式进行外部使用。
此致
char *p_var = "XXX";
创建了一个指向不能更改的字符串字面量的指针,因此编译器实现可以自由地重用字面量,例如:
char *p_var = "XXX";
char *other = "XXX";