【问题标题】:Comparing two char* and two char[ ] strings in C [duplicate]比较 C 中的两个 char* 和两个 char[ ] 字符串 [重复]
【发布时间】:2017-11-17 03:04:58
【问题描述】:
#include <stdio.h>

int main(){
    char a[] = "bar";
    char b[] = "bar";
    printf("%d\n", (a==b));

    char* x = "bar";
    char* y = "bar";
    printf("%d\n", (x==y));
 }  

输出:

0 
1

我知道我们不能使用 == 运算符比较 C 字符数组,因为它比较内存位置,但为什么它在第二种情况下有效?

【问题讨论】:

标签: c arrays string pointers


【解决方案1】:

在第一种情况下,当您定义了两个数组时,编译器为它们分配了两个单独的存储空间,因此ab 不相等。

但是,对于第二种情况,当您使用相同的字符串文字初始化两个指针时,编译器发现它们是相同的字符串,并将两个指针指向相同的地址,即该字符串文字的起始地址(@987654324 @)。 但是,正如@David 所说,这不一定会发生,在某些情况下,删除一些优化或基于某些编译器,xy 可能不一样。

【讨论】:

  • 你应该指出xy不要求指向同一个地址。
  • 我赶紧ran the code as an emperical test,并没有发现“bar”指向同一个内存位置。
  • @BennettYeo 右粗体但是请在我的帖子中。
【解决方案2】:

输出有意义,因为数组的内存存储不相等。对于 char,比较它们的文字字符。尝试运行此示例。

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;
}

This online runnable example表示char的内存引用不一样。

如果您想查看数组的内容是否相等,则需要调用数组中的每个 char 并手动将其与辅助数组进行比较。您可以通过相互检查数组的大小来更快地结束执行。

另外一点是,“指针化”字符或数组在此比较范围内没有任何区别。

【讨论】:

    【解决方案3】:

    这取决于实现

    在第一种情况下,ab 有单独的存储空间,所以它们的地址不会相等。

    但是,编译器可能会识别出xy 指向的字符串是相同的,因此它可以通过使它们指向相同的位置来优化,因为您无法修改它。但是,由于标准不要求这样做,您不能依赖结果。这是一个可选的优化。编译器仍然可以生成两个相同的字符串,并使xy 分别指向它们。

    【讨论】:

    • 不是未定义的行为,因为xy 都包含有效地址;只是依赖于实现。
    • @DavidBowling 去获取一些参考。
    • 参考什么?指针xy 定义明确,编译器是否为它们存储一个或两个字符串,指针比较是否有效。没有UB。如果它让您放心,您可以查看list of undefined behaviors from Annex J.2 以发现其中未列出;)
    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多