比较C中的两个char*和两个char[]字符串
我知道我们不能使用比较C中的两个char*和两个char[]字符串,c,arrays,string,pointers,C,Arrays,String,Pointers,我知道我们不能使用==操作符比较C字符数组,因为它比较内存位置,但为什么它在第二种情况下工作?在第一种情况下,正如您定义的两个数组,编译器为它们分配了两个单独的存储,因此a和b不相等 但是,对于第二种情况,当您使用相同的字符串文本初始化两个指针时,编译器发现它们是相同的字符串,并将两个指针指向相同的地址,该地址是该字符串文本的起始地址(“bar”)。 然而,正如@David所说,这不一定会发生,在某些情况下,删除一些优化,或者基于某些编译器,x和y可能不一样 这取决于实现 在第一种情况下,a和b
==
操作符比较C字符数组,因为它比较内存位置,但为什么它在第二种情况下工作?在第一种情况下,正如您定义的两个数组,编译器为它们分配了两个单独的存储,因此a
和b
不相等
但是,对于第二种情况,当您使用相同的字符串文本初始化两个指针时,编译器发现它们是相同的字符串,并将两个指针指向相同的地址,该地址是该字符串文本的起始地址(“bar”
)。
然而,正如@David所说,这不一定会发生,在某些情况下,删除一些优化,或者基于某些编译器,
x
和y
可能不一样 这取决于实现
在第一种情况下,a
和b
有单独的存储空间,因此它们的地址不相等
但是,编译器可能会确定
x
和y
所指向的字符串是相同的,因此它可能会通过使它们指向相同的位置进行优化,因为您无法修改它们。但是,由于标准没有要求这样做,因此您不能依赖结果。这是一个可选的优化。编译器仍然可以生成两个相同的字符串,并使x
和y
分别指向它们。由于数组的内存存储不相等,因此输出是有意义的。对于字符,比较它们的文字字符。试着运行这个例子
0
1
显示字符的内存引用不相同
如果要查看数组的内容是否相等,则需要调用数组中的每个字符,并手动将其与辅助数组进行比较。通过相互检查数组的大小,可以更快地结束执行
另外一点是,“指针化”字符或数组在这个比较范围内没有区别。在第一种情况下,它可以工作,因为编译器将两个
“bar”
字符串文本识别为相同的,并决定通过共享存储来节省空间,并且让a
和b
都指向它。我不知道为什么它在x
和y
的情况下不这样做,但是,你应该指出,x
和y
没有指向同一地址的要求。我很快就找到了那个“条”指向同一内存位置。@BennettYeo请在我的帖子中使用粗体。这不是未定义的行为,因为x
和y
都包含有效地址;依赖于实现。@DavidBowling去获取一些参考。什么参考?指针x
和y
定义良好,无论编译器为它们存储一个或两个字符串,指针比较都是有效的。没有。如果这能让你安心,你可以查看一下,发现它们中没有列出这一点;)
0
1
int main(void) {
char a[] = "bar";
char b[] = "bar";
printf("Arrays Test: %x == %x ? %d\n",&a,&b,(a==b));
char* x = "bar";
char* y = "bar";
printf("Literals Test: %x == %x ? %d, however x == y ? %d\n",&x,&y, (&x==&y),(x==y));
return 0;
}