我的编译器有一些奇怪的行为。 如果已经定义了特定字符串,那么如果我定义具有相同字符串值的另一个变量,它实际上会指向原始实例。 例如
const char * a = "dog";
const char * b = "dog";
printf("a = %p\n",a);
printf("b = %p\n",b);
示例输出
a = 00404060
b = 00404060
我猜这没有错,但我想知道编译器是否具体或是否有任何相关规则。 问题出现了,因为为我工作的人写了一个应该比较和计算字符串匹配的功能。事实上,他们对指针值进行了比较和统计,但仍然得到了正确答案。
我正在使用gcc(或g ++)4.6.3
答案 0 :(得分:3)
它是特定于编译器的,C标准表示未指定:
C11§6.4.5字符串文字
如果这些数组的元素具有适当的值,则未指定这些数组是否相同。如果程序试图修改这样的数组,则行为是未定义的。
答案 1 :(得分:1)
这是正常行为。第一个和第二个指针指向同一个字符串。这些字符串无法更改,因此编译器没有理由为同一个内存分配2个不同的位置,这就是为什么a和b指向同一个地方:)
我认为标准中没有这样描述,尽管所有编译器(现代编译器都是这样)
答案 2 :(得分:1)
非常允许这样做,甚至允许这样做:
const char *good = "initialised";
const char *bad = "uninitialised";
其中good
可能只指向i
中的第一个bad
。它基本上允许空间优化。
ISO C标准在C11 6.4.5 String literals /7
中讨论了为字符串文字创建的数组:
如果这些数组的元素具有适当的值,则未指定这些数组是否相同。如果程序试图修改这样的数组,则行为是未定义的。
请注意两个略有相似的术语,unspecified
和undefined
。第一个简单地意味着标准对问题没有任何要求,实现可以自由地采用这种方式。
后者更严重,如果您喜欢便携式代码,通常应避免使用未定义的行为。