我有一个简单的程序:
int main() {
char *c = "message";
char *z = "message";
if ( c == z )
printf("Equal!\n");
else
printf("Not equal!\n");
return 0;
}
我想知道为什么这会打印Equal!
,即使在编译时关闭了优化(-O0
)。这将表明c
和都z
指向同一内存区域,因此z
(例如,更改z[0]
为a
)的第一个突变将是昂贵的(需要复制和写入)。
我对正在发生的事情的理解是,我没有声明一个 type 数组char
,而是创建一个指向 a 的第一个字符的指针string literal
。因此,c
和z
都存储在数据段中,而不是堆栈中(并且因为它们都指向相同的字符串文字,c == z
所以是真的)。
这与写作不同:
char c[] = "message";
char z[] = "message";
if ( c == z ) printf("Equal\n");
else printf("Not equal!\n");
打印Not equal!
, 因为c
和z
都存储在内存的可变部分(即堆栈)中,并且分别存储,因此一个突变不会影响另一个。
我的问题是,我看到的行为(c == z
as true
)是定义的行为吗?char *c
尽管没有被声明为 ,但 存储在数据段中似乎令人惊讶const
。
我尝试变异时的行为是否已char *z
定义?为什么,如果char *c = "message"
放在数据段中并因此是只读的,我会得到bus error
而不是编译器错误?例如,如果我这样做:
char *c = "message";
c[0] = 'a';
我得到:
zsh: bus error ./a.out
虽然它编译得很愉快。
任何进一步澄清这里发生的事情以及原因将不胜感激。