这是代码
smem_dmp(char *name, char content[])
{
int i;
int len = strlen(content);
printf("%s\n\n", name);
for(i = 0; i < len; i++)
{
printf("%c\t%p\n", content[i], &content[i] );
}
printf("Done\n\n");
}
print_bar()
{
printf("********************************************************************\n");
}
int main(int argc, char *argv[])
{
char a[16];
char b[16];
strcpy(a, "abcdefghijklmnop");
printf("a = %s\nb = %s\n\n",a,b);
smem_dmp("A", a);
smem_dmp("B", b);
print_bar();
strcpy(b, "ABCDEFGHILKLMNOP");
printf("a = %s\nb = %s\n\n",a,b);
smem_dmp("A", a);
smem_dmp("B", b);
system("PAUSE");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从查看a和b驻留在内存中的位置,我已经找到了正在发生的事情.复制到b的字符串不是以null结尾.这导致a的内容被移除,因为b位于存储器(0028FF30)之前(0028FF20).
怎么了?strcpy(b,"string")是否在遍历堆栈帧变量的所有内存之前不会停止?对不起,如果我没有使用正确的术语.:)
怎么了?并
strcpy(b,"string")没有停止,直到它通过对栈帧变量的所有内存哪里去了?
strcpy复制字节,直到它在源中找到0字节.将其复制到目标,然后strcpy返回.(如果目标不足以容纳包含0终结符的源,则行为未定义,但除非您遇到分段错误,否则实际上您可以依赖于此.)
所以
strcpy(b, "ABCDEFGHILKLMNOP");
Run Code Online (Sandbox Code Playgroud)
从字符串文字到数组复制17个字节--16个字母和0个终止符b,只包含16个元素.这意味着0-terminator被写入超过数组末尾的一个元素b.在你的情况下,这是第一个字节a,并且strcpy(b, "ABCDEFGHIJKLMNOP");有效地a包含一个空字符串.