函数参数中的字符串

时间:2013-06-14 14:44:39

标签: c gcc string-literals function-parameter

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

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

        return 0;
}

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

y将在堆栈中分配,HelloWorld将被复制到该内存。所以修改y将正常工作。 String literals: pointer vs. char array

以下是我的问题:

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

void function(char arr[])
//void function(char *arr)
{
   arr[0] = 'X';
}        
int main()
{
   function("MyString");    
   return 0;
}
  1. 它在功能参数上下文中有何不同?
  2. 不会为功能参数分配内存?
  3. 请分享您的知识。

3 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:6)

function("MyString");

类似于

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

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

function("MyString");

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

答案 2 :(得分:1)

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

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

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