【发布时间】:2013-12-01 08:21:21
【问题描述】:
在我的示例代码中,我比较了两个 char 指针和两个 char 数组,输出为
Output:
case I :true
case II : false
对于案例 II,我知道它被评估为 false,因为 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;
}
【问题讨论】:
-
首先,您不是在比较字符串,而是在比较指针。其次,第一对是指向常量文字的指针,您的编译器可能将它们折叠成只读数据段中的单个常量字符串,因此 both
string和string2包含相同的地址。 -
现在我要问了,
char *string = {"string"};,是什么意思,为什么会编译,编译时没有警告吗? -
@hyde 正在编译,没有任何警告。
-
@Mat 如果我使用 -fwritable-strings 编译代码,那么你是正确的,那么我给出的是错误的。现在我明白了我的情况是真的,因为字符串池。谢谢。
-
@hyde:C 2011 (N1570) 6.7.9 允许使用大括号作为标量(例如指针):“标量的初始化程序应为单个表达式,可选择用大括号括起来。”我不知道为什么这是允许的,但我会假设它是历史性的(例如,为了适应在语言标准化之前允许它的编译器),或者如果总是将大括号用于初始化器,那么在某些情况下自动代码生成会更容易,无论被初始化的对象是标量还是聚合。