C 为什么str1==str2“相等”?

C 为什么str1==str2“相等”?,c,string,character,C,String,Character,代码是: #include<stdio.h> int main() { char *st1="hello"; char *st2="hello"; if(st1==st2) printf("equal %u %u",st1,st2); else printf("unequal"); return 0; } 我得到的输出等于4206628 4206628 st1和st2是指向只读字符串文本的指针。实际上,您应该

代码是:

#include<stdio.h>
int main()
{
    char *st1="hello";
    char *st2="hello";
    if(st1==st2)
        printf("equal %u  %u",st1,st2);
    else
        printf("unequal");
    return 0;
}
我得到的输出等于4206628 4206628

st1和st2是指向只读字符串文本的指针。实际上,您应该使用const char*作为类型,但编译器对此并不在意

在这种特殊情况下,编译器优化了代码,因此只存储一个字符串文本。这种优化是允许的,因为C标准规定任何修改只读字符串的尝试都是未定义的行为。因此指针具有相同的地址。因此,比较指针地址而不是内容的st1==st2为真

C标准不强制要求这种行为,所以不要依赖它。

st1和st2是指向只读字符串文本的指针。实际上,您应该使用const char*作为类型,但编译器对此并不在意

在这种特殊情况下,编译器优化了代码,因此只存储一个字符串文本。这种优化是允许的,因为C标准规定任何修改只读字符串的尝试都是未定义的行为。因此指针具有相同的地址。因此,比较指针地址而不是内容的st1==st2为真


C标准不强制要求这种行为,所以不要依赖它。

报告的值实际上是14206628和4206628,还是额外的1只是一个输入错误?%u需要类型为unsigned int的参数。要打印指针值,请将其转换为void*并使用%p:printfequal%p%p\n,void*st1,void*st2;。你真的想在输出的末尾换行。顺便说一句,您的程序在输出中的单词equal和st1的值之间没有空格。请复制并粘贴您的实际代码和实际输出;否则,我们无法猜测您的代码中有哪些错误,以及您在重新键入时引入了哪些错误。@KeithThompson我将其标记为错误的副本,因为我没有看到它表示“现在相等”,我无法修复它。你可以吗?@iharob:显然我不能。我重新打开了它,但当我试图再次投票关闭它时,它的副本告诉我,我已经投票关闭了它。我将标记它以引起版主注意。报告的值实际上是14206628和4206628,还是额外的1只是一个输入错误?%u需要类型为unsigned int的参数。要打印指针值,请将其转换为void*,并使用%p:printfequal%p%p\n,void*st1,void*st2;。你真的想在输出的末尾换行。顺便说一句,您的程序在输出中的单词equal和st1的值之间没有空格。请复制并粘贴您的实际代码和实际输出;否则,我们无法猜测您的代码中有哪些错误,以及您在重新键入时引入了哪些错误。@KeithThompson我将其标记为错误的副本,因为我没有看到它表示“现在相等”,我无法修复它。你可以吗?@iharob:显然我不能。我重新打开了它,但当我试图再次投票关闭它时,它的副本告诉我,我已经投票关闭了它。我将标记它以引起版主的注意。