如果我们说:
char *p="name";
然后我们该怎么做
if(p=="name"){
printf("able"};//this if condition is true but why?
as“name”这里是一个字符串文字,p
是一个指针,它保存字符串的基地址,然后为什么上面的语句工作正常?
答案 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
,只需比较指针是否相同。
表达式==
将检查两个字符串的内容是否相同。