【问题标题】:why char * and char array behave differently in comparison? [duplicate]为什么 char * 和 char 数组在比较中表现不同? [复制]
【发布时间】:2013-12-01 08:21:21
【问题描述】:

在我的示例代码中,我比较了两个 char 指针和两个 char 数组,输出为

Output:
     case I :true
     case II : false

对于案例 II,我知道它被评估为 false,因为 arr1arr2 的内存分配不同。但我不明白为什么我评估为真的案例。

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 stringstring2 包含相同的地址
  • 现在我要问了,char *string = {"string"};,是什么意思,为什么会编译,编译时没有警告吗?
  • @hyde 正在编译,没有任何警告。
  • @Mat 如果我使用 -fwritable-strings 编译代码,那么你是正确的,那么我给出的是错误的。现在我明白了我的情况是真的,因为字符串池。谢谢。
  • @hyde:C 2011 (N1570) 6.7.9 允许使用大括号作为标量(例如指针):“标量的初始化程序应为单个表达式,可选择用大括号括起来。”我不知道为什么这是允许的,但我会假设它是历史性的(例如,为了适应在语言标准化之前允许它的编译器),或者如果总是将大括号用于初始化器,那么在某些情况下自动代码生成会更容易,无论被初始化的对象是标量还是聚合。

标签: c arrays pointers


【解决方案1】:
if(string == string2){  

是比较指针而不是字符串。在第一次得到它变成真的因为stringstring2都指向同一个内存位置并且条件变成true
对于字符串比较使用库函数strcmp。你会得到正确的结果。

【讨论】:

    【解决方案2】:

    arr1arr2 这两个是指针,所以当你比较这两个时,那些指针将被比较,它们永远不会相同。这就是为什么你得到输出false。现在关于第一种情况:

    当你写作时:

    char *string = {"string"};
    char *string2 = {"string"};
    

    在内存中编译器为您的字符序列分配空间并将指向该区域的指针存储在stringstring2 中。因此,这两者都是不可变的。

    如果你这样做:

    *(string)= 'a';
    

    你会得到错误。

    C 中的字符串文字具有静态存储持续时间。它们永远不会在“堆栈上”分配。它们总是分配在全局/静态内存中,并且只要程序运行就一直存在。

    这称为String interning,即一种仅存储每个不同字符串值的一个副本的方法(如维基百科所说),并且是Flyweight Design Pattern 的一个示例

    更多详情可here

    【讨论】:

    • 我理解,我正在尝试理解案例 I。我认​​为这与字符串池有关。
    • 如果我用 -fwritable-strings 编译代码并写入 string[0] = 'a' 那么它不会崩溃,它会将字符串更改为 atring
    • 你从原始问题中知道了。太好了。
    【解决方案3】:

    arr1 == arr2 表示您正在比较 arr1arr2 的第一个元素的地址。 所以为什么它给false

    char *string = {"string"}; "string" 是常量,stringstring1 都指向同一个位置,这就是为什么 string == string2 给出 true

    您应该使用strcmp 来比较char 的字符串。 运算符==string 中的c++ 一起使用

    【讨论】:

      【解决方案4】:
      char *string = {"string"};
      char *string2 = {"string"};
      
      *string 和 *string2 中的

      "string" 都是字符串文字,相同的字符串文字共享相同的内存空间。这就是为什么 (string == string2) 是真的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 2014-12-21
        • 2021-12-17
        • 1970-01-01
        相关资源
        最近更新 更多