我希望以下两个向量在RAM中具有相同的表示形式:
char a_var[] = "XXX\x00";
char *p_var = "XXX";
但奇怪的是,如果我使用f(char argument[])
调用它,则调用类型为f(p_var)
的库函数会破坏正在运行的应用程序。但是使用f(a_var)
是好的!
为什么?
答案 0 :(得分:27)
第一个创建包含字符串的char数组。可以修改数组的内容。第二个创建一个指向字符串文字的字符指针。字符串文字无法修改。
答案 1 :(得分:1)
猜测,函数f
修改了传递给它的字符串的内容。
答案 2 :(得分:1)
正如其他人所说,char *p_var = "XXX";
创建了一个指向无法更改的字符串文字的指针,因此编译器实现可以自由地重用文字,例如:
char *p_var = "XXX";
char *other = "XXX";
编译器可以选择通过在内存中只存储一次“XXX”并使两个指针指向它来优化它,修改它们的值可能会导致意外行为,这就是为什么你不应该尝试修改它们的内容。
答案 3 :(得分:0)
数组可以(通常)作为指针处理,但这并不意味着它们总是可以互换的。正如另一个所说,你的p_var指向一个文字,一些无法改变的静态。它可以指向其他内容(例如p_var =& a_var [0]),但您无法更改由引号指定的原始值....
类似的问题是当你在一个文件中将变量定义为数组,然后extern-将它用作指针时。
此致