char * vs char []

时间:2013-01-29 01:28:40

标签: c char

  

可能重复:
  C Program String Literals
  Bus error: 10 error

使用Xcode 4.5.2 for C,我想

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

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

是等价的。但第一行给了我一个错误:

  

EXC_BAD_ACCESS(代码= 2,地址= 0x100 ......)

第二行没有给我任何错误。我认为这些在直接C中是等价的。发生了什么?

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

3 个答案:

答案 0 :(得分:4)

它们不一样。

char* s = "bla"

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

char s[4] = "bla";

这将使用文字内容填充缓冲区s(在堆栈上分配)。您可以写入此缓冲区,因为它不是常量内存。

第一种语法被认为是合法的并且不会引发与const正确性相关的错误的原因,与保持与旧版本c的向后兼容性有关。

答案 1 :(得分:1)

这些并不等同于您所发现的。第一个是未定义的行为,因为字符串常量是常量(即const char * const)。它们可能位于只读内存中(访问不良,地址0x100是一个很好的线索),您试图通过第一个stringchar *)修改它。第二个string实际上是char的数组,其中包含可以修改的存储(在这种情况下在堆栈中)。

答案 2 :(得分:0)

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

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

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