直接发送字符串比将字符串指针发送给函数有什么区别?
例如:
void foo(char * a){//suppose foo reads and/or writes to the passed string
...
}
int main(){
foo("asdf");//what is the difference between this
char a[]="asdf";
foo(a);//and this?
}
第一个我遇到了各种各样的访问冲突错误,而第二个我没有,那么两者之间有什么区别?
答案 0 :(得分:5)
在第一种情况下,将字符串文字传递给函数。字符串文字是不可变的,这意味着您无法更改它的任何部分。这是一个存储在只读内存段中的static
数组。尝试更改此字符串会导致Undefined Behavior。
在第二种情况下,构造一个数组,用"asdf"
初始化它并将其传递给函数。在这种情况下,可以修改数组中的字符。
有关详细信息,请参阅question 1.32 of the comp.lang.FAQ。
答案 1 :(得分:1)
首先,您应该知道C中没有字符串,因此没有指向字符串的指针,但指向char数组的指针是可能的。
代码段
foo("asdf");
相当于
char a[]="asdf";
foo(a);
因为在C中,字符串文字是type char []
,因此在两个代码段中没有区别,除了你不能修改foo("asdf");
foo
函数内传递的字符串文字不像第二个片段。