为什么char *和char数组的行为不同?

时间:2013-12-01 08:21:21

标签: c arrays pointers

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

Output:
     case I :true
     case II : false

对于案例II,我理解它被评估为假,因为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;
   }

4 个答案:

答案 0 :(得分:1)

if(string == string2){  

比较指针而不是字符串。首先,它变为真,因为stringstring2指向相同的内存位置,条件变为true
对于字符串比较,请使用库函数strcmp。你会得到正确的结果。

答案 1 :(得分:0)

arr1arr2这两个都是指针,所以当你对这两个指针进行比较时,这些指针将是对比的,它们永远不会相同。这就是为什么你得到输出false。现在关于第一个案例:

当你写:

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

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

如果你这样做:

*(string)= 'a';

你会收到错误。

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

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

有更多详细信息,请here

答案 2 :(得分:0)

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

char *string = {"string"};“字符串”是常量,stringstring1都指向同一位置,string == string2给出true

你应该使用strcmp来比较char的字符串。 运算符==string

中的c++一起使用

答案 3 :(得分:0)

char *string = {"string"};
char *string2 = {"string"};
* string和* string2中的

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