为什么字符串字面值可以与指针进行比较?

6

如果我们说:

 char *p="name";

那么我们该怎么做呢?
if(p=="name"){
 printf("able"};//this if condition is true but why?

在这里,“name”是一个字符串字面量,p是一个指针,它保存了字符串的基地址,那么为什么上述语句可以正常工作呢?


7
这是一种编译器优化,但你不能依赖它。 - Hans Passant
与@YuHao指出的问题非常相似。同一课程材料吗? - crashmstr
4个回答

7

无法确定是否将相同的字符串字面值视为相同并具有相同的地址,因此这不是可移植行为。来自草案C99标准第6.4.5字符串字面值

如果它们的元素具有适当的值,则不确定这些数组是否不同。 [...]

如果要比较两个字符串,应使用strcmp


2
C标准允许比较为真,但也允许比较为假(行为未指定)。这取决于编译器执行常见的字符串合并(gcc有一个选项来打开或关闭它)。
来自gcc 4.8.1手册:
-fmerge-constants尝试在编译单元之间合并相同的常量(字符串常量和浮点常量)。如果汇编程序和链接器支持,则此选项是优化编译的默认选项。使用-fno-merge-constants来禁止此行为。在级别-O、-O2、-O3、-Os下启用。
-fmerge-all-constants尝试合并相同的常量和变量。
因此,您观察到的是编译器对两个"name"文字执行字符串合并。

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 将检查两个字符串的内容是否相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接