12
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. 它在函数参数上下文中有何不同?
  2. 不会为函数参数分配内存??

请分享你的知识。

4

3 回答 3

25

在函数参数列表里面,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";,不要尝试修改它们。

于 2013-06-14T14:48:17.400 回答
7
function("MyString");

类似于

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

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

function("MyString");

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

于 2013-06-14T14:47:15.747 回答
2

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

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

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

于 2016-05-23T20:49:27.027 回答