【问题标题】:passing string literal to function is not allowing to modify [duplicate]将字符串文字传递给函数不允许修改[重复]
【发布时间】:2014-05-22 15:32:54
【问题描述】:

方案一:

 void function(char arr[])
 {
   arr[0] = 'X';
   printf("%s",arr);
 }       

 int main()
 {
   function("MyString");  
 }

输出:分段错误

方案二:

   int main()
   {
    char arr[] = "MyString";
    arr[0] = 'X';
    printf("%s",arr);
   }

输出:XyString

程序 1 和程序 2 有什么区别?在 prog1 中,字符串值(不是通过引用)也传递给数组,所以它应该复制到数组并允许修改它?但它会引发分段错误。在 prog2 中成功允许更改 arr[]。为什么在 prog1 中它不起作用?

【问题讨论】:

  • 我认为您(正确地)对void function(char arr[]) 中的参数声明和char arr[] = "MyString"; 中的变量声明的相似性感到困惑。函数声明可以等效地写为void function(char *arr),这可能更常见。正如有人所说,您在调用“衰减”中传递的字符数组指向指向其第一个元素的指针。在大多数情况下,数组都是这样做的。文字是可执行文件的一部分,因此通常不可写。虽然在视觉上非常相似,但字符串文字的内容在程序 2 中复制arr
  • 我的空间用完了...不同之处在于程序 2 中的 arr 是一个真正的数组,它像任何其他局部变量一样“在堆栈上”创建。 “MyString”的内容被复制到其中。与任何其他局部变量一样,写入它是完全安全的。

标签: c++ c


【解决方案1】:
  1. Prog 1:您正在传递一个字符串文字,它以const char* 的形式发送到函数。您不能更改 const 对象。
  2. Prog 2:您使用的是非常量字符数组,可以修改。

来自您的评论:

在 prog1 中,字符串值(不是通过引用)也被传递给数组,所以它应该复制到数组并允许修改它?

错误。在程序 1 中,字符串文字放置在内存中的某个位置(可能在 只读 内存中,因为它是常量),然后发送指向该内存位置的 const char*字符数组不作为参数发送,只发送第一个字符的地址。

【讨论】:

  • 当一个参数通过值传递给函数时,那么它的值需要被复制并且应该被允许。但为什么在这种情况下没有发生?
  • 参数是指向字符的指针,不是字符。
  • @user3665615 数组总是通过指向其第一个元素的指针传递。 char * achar a[]谈参数的时候是一样的。
  • @PeterSchneider,显然 OP 不能使用他的编译器,这是正确的行为,如果符合先前标准的编译器允许这样做并不重要。允许这样做的编译器也允许编写这样的不安全代码。
  • 我想说的是,在 C++11 之前,出于兼容性原因,在法律上可以用字符串字面量初始化 char 指针。语言和编译器允许这样做。但是,当您写信给它时发生的事情是未定义的。 C++11 最终禁止它,但 OP 的编译器明确允许赋值。因此字符串文字衰减为 char *,否则 OP 无法将其传递给函数!参照。 stackoverflow.com/questions/2245664/string-literals-in-c.
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多