直接发送字符串比将字符串指针发送给函数有什么区别?

时间:2015-02-19 12:04:28

标签: c syntax error-handling

直接发送字符串比将字符串指针发送给函数有什么区别?

例如:

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?
}

第一个我遇到了各种各样的访问冲突错误,而第二个我没有,那么两者之间有什么区别?

2 个答案:

答案 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函数内传递的字符串文字不像第二个片段。