4

可能重复:
C 程序字符串文字
总线错误:10 错误

我想为 C 使用 Xcode 4.5.2

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
4

3 回答 3

9

他们不一样。

char* s = "bla"

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

char s[4] = "bla";

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

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

于 2013-01-29T01:33:43.957 回答
1

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

于 2013-01-29T01:30:15.167 回答
0

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

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

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

于 2013-01-29T01:32:52.470 回答