char *与char[]的区别

4
使用Xcode 4.5.2进行C语言编程时,我认为可能重复:
C程序字符串字面量
总线错误:10错误

char * string = "abc";
string[0] = 'f';

并且。
char string[4] = "abc";
string[0] = 'f'; 

这两行代码看起来是等价的,但第一行会报错:

EXC_BAD_ACCESS (code = 2, address = 0x100 ...)

而第二行不会出错。在纯C语言中,我认为这两行代码应该是等价的,发生了什么事情呢?

int main (void) {
    char * string = "abc";   
    string[0] = 'f';
} // main

就在前几天还有一个关于这个问题的提问 - 但我找不到了。有人能帮忙找一下吗? - Preet Sangha
6
关于这个问题,几乎每两天就会有一个类似的提问 :) - Sergey Kalinichenko
如果你是C语言的新手,你可以像我一样直接在搜索引擎上提出问题。但是,收到负面评价并被标记为重复问题会让新手像我一样学习更少。感谢你的提问。 - nerkn
3个回答

9

它们不是相同的。

char* s = "bla"

以上指向存储字符串文字的内存位置。由于这是只读内存(文字是常量),因此对它的写入失败。

char s[4] = "bla";

该代码将栈上分配的缓冲区(名为“s”)填充为文字内容。由于它不是const内存,因此可以向此缓冲区写入数据。 第一种语法之所以被认为是合法的,并且不会引发与const相关的错误,原因在于保持与早期版本的C向后兼容性。

感谢大家纠正了我的错误观念。 - Cary Rader

1
这两者并不等同,正如你所发现的那样。第一个是未定义行为,因为字符串常量是常量(即const char * const)。它们可能位于只读内存中(访问错误,地址0x100是一个很好的提示),而你正在尝试通过第一个string(它是一个char *)修改它们。第二个string实际上是一个char数组,它具有存储空间(在这种情况下是在堆栈上),可以被修改。

0

第一个指针指向受保护的内存,其中加载了程序中的字符串。

第二个指针指向新分配的4个字符的字段。

因此,写入第一个字段会报告对内存的非法访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接