直接发送字符串与发送指向字符串的指针给函数有什么区别?

What is the difference between sending a string directly than sending a pointer to a string to a function?

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

例如:

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

对于第一个,我会遇到各种访问冲突错误,而对于第二个,我不会,那么两者之间有什么区别?

首先你应该知道在C中没有字符串,因此没有指向字符串的指针,但是指向char数组的指针是可能的。

代码片段

foo("asdf");  

等同于

char a[]="asdf";
foo(a);  

因为在 C 中,字符串文字是 type char [],因此除了您不能修改在 [=14= 中的 foo("asdf"); 中传递的字符串文字外,这两个代码段没有区别] 功能不同于第二个片段。

在第一种情况下,您将字符串文字传递给函数。字符串文字是不可变的,这意味着您不能更改它的任何部分。这是一个存储在只读内存段中的 static 数组。尝试更改此字符串会导致 Undefined Behavior.

在第二种情况下,您构造一个数组,使用 "asdf" 对其进行初始化并将其传递给函数。这种情况下,可以修改数组中的字符。

有关详细信息,请参阅 question 1.32 of the comp.lang.FAQ