函数参数中的字符串

int main() { char *x = "HelloWorld"; char y[] = "HelloWorld"; x[0] = 'Z'; //y[0] = 'M'; return 0; } 

在上面的程序中, HelloWorld将处于只读部分(即字符串表)。 x将指向该只读部分,因此尝试修改该值将是未定义的行为。

但是y将被分配在堆栈中, HelloWorld将被复制到该内存中。 所以修改y将正常工作。 字符串文字:指针与字符数组

这是我的问题:

在以下程序中,如果内容被修改, char *arrchar arr[]都会导致分段错误。

 void function(char arr[]) //void function(char *arr) { arr[0] = 'X'; } int main() { function("MyString"); return 0; } 
  1. 它在function参数上下文中有何不同?
  2. 没有为函数参数分配内存?

请分享您的知识。

在函数参数列表中, char arr[]绝对等同于char *arr ,因此这对定义和一对声明是等效的。

 void function(char arr[]) { ... } void function(char *arr) { ... } void function(char arr[]); void function(char *arr); 

问题是调用上下文。 你为函数提供了一个字符串文字; 字符串文字可能无法修改; 你的函数试图修改它给出的字符串文字; 您的程序调用了未定义的行为并崩溃了。 一切都完全是洁净的。

将字符串文字视为static const char literal[] = "string literal"; 并且不要尝试修改它们。

 function("MyString"); 

类似于

 char *s = "MyString"; function(s); 

"MyString"在两种情况下都是字符串文字,在这两种情况下字符串都是不可修改的。

 function("MyString"); 

传递字符串文字的地址以作为参数。

char * arr; 上面的语句暗示arr是一个字符指针,它可以指向一个字符或一个字符串

&char arr []; 上面的语句暗示arr是字符串,可以存储尽可能多的字符,甚至可以存储一个字符但总是依赖’\ 0’字符,因此使它成为一个字符串(例如char arr [] =“a”类似于char arr [] = {‘a’,’\ 0’})

但是当在被调用函数中用作参数时,传递的字符串在正式参数中逐个字符存储,没有区别。