为什么字符串文字与指针相当?

时间:2014-03-05 13:02:04

标签: c string-literals

如果我们说:

 char *p="name";

然后我们该怎么做

if(p=="name"){
 printf("able"};//this if condition is true but why?

as“name”这里是一个字符串文字,p是一个指针,它保存字符串的基地址,然后为什么上面的语句工作正常?

4 个答案:

答案 0 :(得分:7)

未指定的行为是否可以认为相同的字符串文字相同,因此具有相同的地址。所以这不是可移植的行为。从草案C99标准部分6.4.5 字符串文字

  

如果这些数组的元素具有不同的数据,则未指定   适当的价值观[...]

如果你想比较两个字符串,你应该使用strcmp

答案 1 :(得分:2)

C标准允许比较为真,但也允许它为假(行为未指定)。这取决于编译器执行常见的字符串合并(gcc可以选择打开或关闭它)。

来自gcc 4.8.1手册:

  

-fmerge-constants      尝试合并相同的常量(字符串常量和浮点常量)      跨编译单位。

     

如果汇编器和链接器支持,则此选项是优化编译的默认选项。   使用-fno-merge-constants来禁止此行为。      启用级别-O,-O2,-O3,-Os。

     

-fmerge-all-constants      尝试合并相同的常量和相同的变量。

所以你观察到的是一个编译器为两个"name"文字执行字符串合并。

答案 2 :(得分:1)

字符串文字不是内存引用,因此当你执行char *p="name";时,它只是意味着:

     |n |a |m | e
    /
   p

p指向字符串文字的第一个字符。所以这样做:

p=="name"评估为someAddress==someAddress。但是,此行为未指定。

答案 3 :(得分:1)

好的,让我们来看看它的作用。

p是指向name\0的指针。所以,在这里你要将p(指针)与"name"(也是一个指针)进行比较。嗯,唯一的方法是,如果某个地方有p="name",即便如此,"name"也无法保证指向同一个地方。

我相信您实际需要的是strcmp来比较整个字符串,或者您想要if (*p == 'n')来比较p字符串的第一个字符与{{} 1}}字符

您希望使用n来比较字符串而不是简单的strcmp() == 0,只需比较指针是否相同。

表达式==将检查两个字符串的内容是否相同。