在我的示例代码中,我正在比较两个char指针和两个char数组,输出是
Output:
case I :true
case II : false
对于案例II,我理解它被评估为假,因为arr1
和arr2
的内存分配不同。但我不明白为什么我的评价为真。
int main()
{
char *string = {"string"};
char *string2 = {"string"};
char arr1[] = {"string"};
char arr2[] = {"string"};
/******* case I **********/
if(string == string2){
printf("case I :true \n");
}
else{
printf("case I :false \n");
}
/****** case II **********/
if(arr1 == arr2){
printf("case II : true \n");
}
else{
printf("case II : false \n");
}
return 0;
}
答案 0 :(得分:1)
if(string == string2){
比较指针而不是字符串。首先,它变为真,因为string
和string2
指向相同的内存位置,条件变为true
。
对于字符串比较,请使用库函数strcmp
。你会得到正确的结果。
答案 1 :(得分:0)
arr1
和arr2
这两个都是指针,所以当你对这两个指针进行比较时,这些指针将是对比的,它们永远不会相同。这就是为什么你得到输出false
。现在关于第一个案例:
当你写:
char *string = {"string"};
char *string2 = {"string"};
在内存编译器中为您的字符序列分配空间,并在string
和string2
中存储指向此区域的指针。因此,这两者都是不可变的。
如果你这样做:
*(string)= 'a';
你会收到错误。
C中的字符串文字具有静态存储持续时间。它们永远不会“堆叠”。它们总是在全局/静态内存中分配,并且只要程序运行就会保留。
这称为String interning,即只存储每个不同字符串值的一个副本的方法(如维基百科所说),并且是Flyweight Design Pattern的一个示例
有更多详细信息,请here
答案 2 :(得分:0)
arr1 == arr2
表示您正在比较arr1
和arr2
的第一个元素的地址。
这就是为什么它给false
。
char *string = {"string"};
“字符串”是常量,string
和string1
都指向同一位置,string == string2
给出true
你应该使用strcmp
来比较char的字符串。
运算符==
与string
c++
一起使用
答案 3 :(得分:0)
char *string = {"string"};
char *string2 = {"string"};
* string和* string2中的“string”是字符串文字,相同的字符串文字共享相同的内存空间。这就是为什么(string == string2)证明是真的。