为什么strcmp()返回' 0'虽然我不提供空终止字符串?

时间:2014-06-11 06:17:22

标签: c

在下面的代码中,我期待一些奇怪的行为(比如无限循环),因为我没有提供空终止字符串作为strcmp()函数的输入。

#include <stdio.h>

int main() 
{
  char string1[20];
  char string2[20] = {'H','e','l','l','o',};

  strcpy(string1, "Hello");
 // strcpy(string2, "Hellooo");
  printf("Return Value is : %d\n", strcmp( string1, string2));

  return 0;
}

输出结果为:

 Return Value is : 0

为什么它向我展示两个字符串是否相等?

我的猜测是当我初始化数组(string2)时,rest元素被填充为零。但是因为数组是本地的,所以不应该是这种情况。

6 个答案:

答案 0 :(得分:6)

如果数组或结构的初始化程序仅为数组或结构的某些部分提供数据,则数组或结构的其余部分将设置为0。这是string2的情况。

答案 1 :(得分:5)

我抛弃了string2,我得到了

72 101 108 108 111 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

string2的其余部分填充了0 s

for (i = 0; i < 20; i++)
    printf("%d ", string2[i]);

当我这样做时,我得到了

char string2[20];

string2[0] = 'H';
string2[1] = 'e';
string2[2] = 'l';
string2[3] = 'l';
string2[4] = 'o';

72 101 108 108 111 127 0 0 -27 5 64 0 0 0 0 0 -1 -78 -16 0 Return Value is : 127

初始化定义部分中的字符串时,字符串的其余部分将填充0 s。

但是,当你只是定义它然后为它们赋值时,它会被垃圾值填充

答案 2 :(得分:2)

Partially initialised数组将用剩余未初始化内存的零填充或初始化

e.g

int a[10]={1,2,3}

剩余的索引将用零(0)

填充(初始化)

答案 3 :(得分:2)

已经每个人都用正确的答案启发了你。这个例子是为了让它更清晰::

int main( int argc, char** argv )
{
 char temp[100] = {'A'} ;
 return 0 ;
}

数组初始化部分的反汇编是::

//char temp[100] = {'A'} ;
// 41h is 'A', so this instruction fills the first index with 'A'
mov         byte ptr [ebp-6Ch],41h 
push        63h  
push        0    
lea         eax,[ebp-6Bh] 
push        eax 

// Then it calls memset which in turn fills the rest of array with zeroes.
call        @ILT+115(_memset) (0B11078h) 
add         esp,0Ch

答案 4 :(得分:1)

string2数组的范围是全局还是本地,在这种情况下,它将初始化为零。

您将观察到的唯一区别是当您在本地声明string2并且根本不对其进行初始化时,即char string2[20];

这样做就可以在堆栈上本地分配string2并且不会发生明确的初始化,但是如果你在全局做同样的事情,数组将被初始化为零(所有索引)。

因此,你的猜测是部分正确的!!

答案 5 :(得分:1)

  

C11(n1570),§7.24.2.3 strcpy 功能

     

strcpy函数复制s2指向的字符串(包括   s1指向的数组中的终止空字符

string1和string2中的前6个元素变得相同。终结者也在同一个位置。