函数参数中的字符串

Jey*_*ram 12 c gcc string-literals function-parameter

int main()
{
        char *x = "HelloWorld";
        char y[] = "HelloWorld";

        x[0] = 'Z';
        //y[0] = 'M';

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的程序中,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;
}
Run Code Online (Sandbox Code Playgroud)
  1. 它在功能参数上下文中有何不同?
  2. 没有为功能参数分配内存?

请分享您的知识.

Jon*_*ler 22

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

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

void function(char arr[]);
void function(char *arr);
Run Code Online (Sandbox Code Playgroud)

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

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


oua*_*uah 6

function("MyString");
Run Code Online (Sandbox Code Playgroud)

类似于

char *s = "MyString";
function(s);
Run Code Online (Sandbox Code Playgroud)

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

function("MyString");
Run Code Online (Sandbox Code Playgroud)

将字符串文字的地址function作为参数传递.