以下(关于const char *)是编译器特定的功能吗?

时间:2015-09-16 05:27:28

标签: c

我的编译器有一些奇怪的行为。 如果已经定义了特定字符串,那么如果我定义具有相同字符串值的另一个变量,它实际上会指向原始实例。 例如

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

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中讨论了为字符串文字创建的数组:

  

如果这些数组的元素具有适当的值,则未指定这些数组是否相同。如果程序试图修改这样的数组,则行为是未定义的。

请注意两个略有相似的术语,unspecifiedundefined。第一个简单地意味着标准对问题没有任何要求,实现可以自由地采用这种方式。

后者更严重,如果您喜欢便携式代码,通常应避免使用未定义的行为。