先看如下代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char s1[20] = { 0 };
char s2[2] = { 0 };
strcpy(s1, "ModernEducation");
printf("s1=%s\n", s1);
strcpy(s2, "TechnologyCenter");
printf("s1=%s\n", s1);
printf("s2=%s\n",s2);
return 0;
}
运行结果为:
s1=ModernEducation
s1=nter
s2=TechnologyCenter
- 这个问题显然是由内存存储的数据发生了变化而产生的,整个程序有两处对内存进行了操作,所以可紧挨着这两处操作设置断点,观察内存数据变化情况。即在A和B行设置普通位置断点,按【F5】键运行程序,程序停在A行。在自动窗口中可看到数组s1的地址及其内容,此时s1的内容正确。
- 按【F5】键继续运行,程序停在B处,在自动窗口观察s1和s2的地址及其内容,s2的内容正确,但s1的内容变成了s2的后4个字符,也就是说覆盖了s1,在断点A和断点B之间,只有strcpy(s2, "TechnologyCenter");改变了内存内容,分析这两个窗口的两行信息,发现VC给s2分配的地址比s1小,二者相差了12个字节,而strcpy()函数复制的字符串,需要从s2地址开始连续17个字节,以便存储其中的字符串和‘\0’,也就是说这个字符串也占用了数组s1的存储空间,即将"nter"和‘\0’覆写了数组s1,s1的内容变为"nter"。
- 终止调试,修改程序中定义数组s2的大小,字符数组的长度一定摇大于被复制的字符串长度,如改为s2[20],在运行程序,输出结果正确。