内存溢出实例

前几天编写了个时间转换的函数,但是运行一直出问题。

在VC的编译器上,出现内存访问错误的严重警告

在GCC的编译器上,提示“空间不足”

代码如下:

 

#include <string.h>
#include <math.h>
#include <time.h>

 

int  main()
{
 time_t tm_start,tm_end;
 char astr_start[] = "2008-08-08 08:08:00/n";
 char astr_end[] = "2008-08-08 08:08:00/n";
 time(&tm_start);
 TimeChange( ctime(&tm_start), astr_start );
 printf("%s/n",astr_start);

 

................

 

 time(&tm_end);
 TimeChange( ctime(&tm_end), astr_end );
 printf("%s/n",astr_end);
 return 0;

}

/************************************************************************/
/* Change time type:"Fri Apr 29 12:25:12 1994" -> "1994-04-29 12:25:12" */
/************************************************************************/
int TimeChange( char* pchTimeBefore, char achTimeAfter[] )
{
 
 char achYear[4] = "1994";
 char achMonth[3] = "Apr";
 char achDay[2] = "29";
 char achHour[2] = "12";
 char achMinute[2] = "25";
 char achSecond[2] = "12";
 char achWeek[3] = "Fri";

 int i = 0;
 char achTimeAfterTemp[21];

 if( NULL == pchTimeBefore || NULL == achTimeAfter )
 {
  printf("time is NULL!/n");
  return -1;
 }
 
 strcopy(achYear, pchTimeBefore, 20, 4);
 strcopy(achMonth, pchTimeBefore, 4, 3);
 strcopy(achDay, pchTimeBefore, 8, 2);
 strcopy(achHour, pchTimeBefore, 11, 2);
 strcopy(achMinute, pchTimeBefore, 14, 2);
 strcopy(achSecond, pchTimeBefore, 17, 2);
 strcopy(achWeek, pchTimeBefore, 0, 3);

 if( 0 == strcmp("Jan",achMonth) )
 {
  memcpy(achMonth,"01",2);
 }
 else if( 0 == strcmp("Feb",achMonth) )
 {
  memcpy(achMonth,"02",2);
 }
 else if( 0 == strcmp("Mar",achMonth) )
 {
  memcpy(achMonth,"03",2);
 }
 else if( 0 == strcmp("Apr",achMonth) )
 {
  memcpy(achMonth,"04",2);
 }
 else if( 0 == strcmp("May",achMonth) )
 {
  memcpy(achMonth,"05",2);
 }
 else if( 0 == strcmp("Jun",achMonth) )
 {
  memcpy(achMonth,"06",2);
 }
 else if( 0 == strcmp("Jul",achMonth) )
 {
  memcpy(achMonth,"07",2);
 }
 else if( 0 == strcmp("Aug",achMonth) )
 {
  memcpy(achMonth,"08",2);
 }
 else if( 0 == strcmp("Sep",achMonth) )
 {
  memcpy(achMonth,"09",2);
 }
 else if( 0 == strcmp("Oct",achMonth) )
 {
  memcpy(achMonth,"10",2);
 }
 else if( 0 == strcmp("Nov",achMonth) )
 {
  memcpy(achMonth,"11",2);
 }
 else if( 0 == strcmp("Dec",achMonth) )
 {
  memcpy(achMonth,"12",2);
 }
 else
 {
  return -1;
 }
 achMonth[2] = '/0';

 strcpy(achTimeAfterTemp, achYear );
 strcat(achTimeAfterTemp, "-");
 strcat(achTimeAfterTemp,achMonth);
 strcat(achTimeAfterTemp, "-");
 strcat(achTimeAfterTemp, achDay);
 strcat(achTimeAfterTemp, " ");
 strcat(achTimeAfterTemp, achHour);
 strcat(achTimeAfterTemp, ":");
 strcat(achTimeAfterTemp, achMinute);
 strcat(achTimeAfterTemp, ":");
 strcat(achTimeAfterTemp, achSecond);
 strcat(achTimeAfterTemp, "/n");

 memcpy(achTimeAfter,achTimeAfterTemp,strlen(achTimeAfterTemp));
 achTimeAfter[strlen(achTimeAfterTemp)] = '/0';
 
 return 0;
}

int strcopy( char *pDes, char *pSrc, unsigned int pos, unsigned int chlen )
{
 int i = 0;
 int len = strlen(pSrc);
 int lenD = strlen(pDes);

 if( NULL == pSrc || NULL == pDes )
 {
  printf("string is NULL!/n");
  return -1;
 }

 len = strlen(pSrc);
 if( len < chlen )
 {
  printf("chlen(%d) is too big : len(%d)!/n",chlen,len);
  return -1;
 }
 
 lenD = strlen(pDes);
 if( chlen > lenD )
 {
  printf("chlen(%d) is too small : lenD(%d)!/n",chlen,lenD);
  return -1;
 }

 if( 0 > pos || pos >= len )
 {
  printf("pos(%d) is wrong : len(%d)!/n",pos,len);
  return -1;
 }

 i = pos;
 while( i < pos + chlen )
 {
  *(pDes + i - pos) = *(pSrc + i);
  i++;
 }
 *(pDes + chlen) = '/0';

 return 0;
}

 

最后再次审查代码,发现是数组分配空间时,没有考虑到'/0',因而发生了内存溢出。

修正:数组长度+1

结果:VC编译器和GCC编译器均正常通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值