C++中strcmp和 ==的比较问题
    char *str1 = "hello";
    char str2[] = "hello";
    if (str1 == "hello")
        printf("ok1\n");
    if (str2 == "hello")
        printf("ok2\n");
    if (strcmp(str1, "hello"))
        printf("ok3\n");
    if (strcmp(str2, "hello"))
        printf("ok4\n");

一道基础题,知道 ==比较地址,strcmp比较内容。
请各位大神指教为何输出的是 ok1 谢谢!

9个回答

"hello"是字符串常量,编译器会进行优化:

由于所有的"hello"都是相同的,整个程序中只需要有一个"hello"字符串。然后所有引用"hello"这个字符串的**指针变量**都赋值成相同的地址。

所以:

char *str1 = "hello";"hello"的地址是相同的。

对于:char str2[] = "hello";,这里str2并不是指针,类型里已经说明它是一个数组,所以这会是另一个内存地址,于是str2"hello"的地址是不同的。

strcmp的部分你应该清楚,我就不解释了。

search91
search91 回复开水: 懂了,谢了
5 年多之前 回复
Cashey1991
开水 这题里的str2属于局部变量,局部变量都是在栈里的。
5 年多之前 回复
search91
search91 那str2是存在那个内存区,栈?
5 年多之前 回复

char *str1 = "hello";

等价为

const char *str1 = "hello";

所以

if (str1 == "hello")
printf("ok1\n");

是正常的

search91
search91 同意,*str1 = 'g'; //运行错误
5 年多之前 回复

#include"stdio.h"
#include"string.h"

main()
{
char *str1 = "hello";
char str2[] = "hello";
printf("%d\n",str1 == "hello");
printf("%d\n",str2 == "hello");
printf("%d\n",strcmp(str1,"hello"));
printf("%d\n",strcmp(str2,"hello"))
输出结果1 0 0 0 。说明
1. str2 == "hello"是不成立的。字符串的比较不能用==
2. strcmp(str1,"hello"),strcmp(str2,"hello")都是成立的,因为成立的时候strcmp里边两个参数相等的时候值为0

char *str1 = "hello";
"hello"是储存在静态常量区的,你在对str1赋值的时候,系统默认将str1指向"hello",导致string和"hello"地址相同。

这是编译器优化的结果。
定义 char *str1 = "hello"; 时 str1 是指向常量字符串 "hello" 的。"hello" 存贮于常量区!
再在代码中出现 "hello" 时,会使用常量区已经有的、不会再重新定义。

任何试图修改 str1 所指的字符串的代码,将产生异常错误。

常量直接比地址就行了吧

谢谢大家的回答 :
str1中的hello在常量存储区,

str2并不是指针,类型里已经说明它是一个数组,所以这会是另一个内存地址

str2是作为局部变量存在栈中吗?

if (str1 == "hello") 因为==是比较地址. 而str1与"hello"都是同一地址, 的以会相等.

注: "hello"是常量区中的一个串, str1又是指向这个串的. (str1 == "hello") 比较的就是str1指向的地址, 与"hello"串所在的地址. 两个地址当然是相同的了

"hello"是字符串常量,编译器会进行优化:

由于所有的"hello"都是相同的,整个程序中只需要有一个"hello"字符串。然后所有引用"hello"这个字符串的**指针变量**都赋值成相同的地址。

所以:

char *str1 = "hello";和"hello"的地址是相同的。

对于:char str2[] = "hello";,这里str2并不是指针,类型里已经说明它是一个数组,所以这会是另一个内存地址,于是str2与"hello"的地址是不同的。

strcmp的部分你应该清楚,我就不解释了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐