【发布时间】: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”的内容被复制到其中。与任何其他局部变量一样,写入它是完全安全的。