C语言中,“char var[]”和“char *var”的区别是什么?

18

我期望以下两个向量在RAM中有相同的表示:

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

但很奇怪,如果我使用 f(p_var) 来调用类型为 f(char argument[]) 的库函数,应用程序就会崩溃。但是使用 f(a_var) 是可以的!

为什么?

4个回答

30

第一个创建了一个包含字符串的字符数组。该数组的内容可以被修改。第二个创建了一个指向字符串字面量的字符指针。字符串字面量是不可修改的。


15
你的理解是错误的。标准禁止修改字符串字面量。 - anon
4
修改字符串常量会引发未定义行为(UB)。 - Prasoon Saurav
4
我无法访问C标准,但是C++标准规定(2.13.4.2):"试图修改字符串常量的行为未定义。" - Andreas Brinck
2
@Andreas:C标准也是这么说的。请阅读第6.4.5节 :) - Prasoon Saurav
1
@Thomas 不是这样的,恐怕我必须说。编译器会在编译时创建数组内容。 - anon
显示剩余3条评论

1

根据推测,函数f修改了传递给它的字符串的内容。


是的,它会进行修改。但为什么 f(p_var) 会导致崩溃而 f(a_var) 不会呢? - psihodelia
1
因为: char* p_var = "XXX"; 无法被修改。 - Pablo Santa Cruz

1

数组通常可以被视为指针,但这并不意味着它们总是可以互换使用。正如其他人所说,您的p_var指向一个文字常量,即静态的、无法更改的内容。它可以指向其他内容(例如p_var = &a_var[0]),但您无法更改通过引号指定的原始值....

类似的问题出现在您在一个文件中将变量定义为数组,然后在另一个文件中以指针形式进行外部使用。

此致


1
正如其他人所说,char *p_var = "XXX";创建了一个指向不能更改的字符串字面量的指针,因此编译器实现可以自由地重用字面量,例如:

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

编译器可以通过只在内存中存储一次“XXX”并使两个指针都指向它来进行优化,修改它们的值可能会导致意外行为,因此您不应尝试修改它们的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接