2014-03-05 36 views
5

如果我们说:为什么字符串文字与指针相似?

char *p="name"; 

那么,我们该怎么办

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

为“名”这里是一个字符串文字,p是包含字符串的基地址,那么为什么指针上面的声明工作正常?

+7

这是一个编译器优化。一个你不能依靠的。 –

+0

与@余浩​​指出的极其类似的问题指出。相同的课程材料? – crashmstr

回答

6

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

它是未指定的这些阵列是否是不同的条件是它们的元件具有 适当的值。 [...]

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

1

字符串常量是什么内存的引用,因此,当你做char *p="name";这一点,它意味着什么,但:

 |n |a |m | e 
    /
    p 

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

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

1

好吧,让我们来看看它的功能。

p是指向name\0的指针。所以,在这里你要比较p(一个指针)和"name"(也是一个指针)。那么,这将是唯一的方式是真实的是,如果你有某个地方p="name",即使如此,"name"不保证指向同一个地方。

我相信你实际上是在寻找或者是strcmp整个字符串比较或你想要做if (*p == 'n')p字符串的第一个字符比较的n字符

你想用strcmp() == 0比较字符串而不是简单的==,它只会比较指针是否相同。

表达式strcmp(p, "name") == 0将检查两个字符串的内容是否相同。

2

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

来自gcc 4.8。1个手册:

-fmerge-constants 试图合并相同的常数(字符串常量和浮点常数) 不同编译单元。

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

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

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