应用断点分析程序

先看如下代码:

#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
  1. 这个问题显然是由内存存储的数据发生了变化而产生的,整个程序有两处对内存进行了操作,所以可紧挨着这两处操作设置断点,观察内存数据变化情况。即在A和B行设置普通位置断点,按【F5】键运行程序,程序停在A行。在自动窗口中可看到数组s1的地址及其内容,此时s1的内容正确。
  2. 按【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"。
  3. 终止调试,修改程序中定义数组s2的大小,字符数组的长度一定摇大于被复制的字符串长度,如改为s2[20],在运行程序,输出结果正确。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值