在下面的代码中,我期待一些奇怪的行为(比如无限循环),因为我没有提供空终止字符串作为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元素被填充为零。但是因为数组是本地的,所以不应该是这种情况。
答案 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个元素变得相同。终结者也在同一个位置。