使用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
答案 0 :(得分:4)
它们不一样。
char* s = "bla"
以上内容指向存储字符串文字的内存位置。由于这是一个只读存储器(文字是常量),因此写入失败。
char s[4] = "bla";
这将使用文字内容填充缓冲区s
(在堆栈上分配)。您可以写入此缓冲区,因为它不是常量内存。
第一种语法被认为是合法的并且不会引发与const正确性相关的错误的原因,与保持与旧版本c的向后兼容性有关。
答案 1 :(得分:1)
这些并不等同于您所发现的。第一个是未定义的行为,因为字符串常量是常量(即const char * const
)。它们可能位于只读内存中(访问不良,地址0x100是一个很好的线索),您试图通过第一个string
(char *
)修改它。第二个string
实际上是char
的数组,其中包含可以修改的存储(在这种情况下在堆栈中)。
答案 2 :(得分:0)
第一个指针指向受保护的内存,其中加载了程序中的字符串。
第二个指针指向新分配的4个字符的字段。
因此,写入第一个字段会报告非法访问内存。