自定义strcpy背后的一个小陷阱:还是要记日志啊。

 

好了 。 终于又回归校园了。。  好吧,好好学习,天天日志。

记录一下一个问题是这样的:

大家都知道自定义的strcpy,是很简单的一个函数。上次有位网友问了这样一个问题,我觉得非常有代表性,所以要记录下来跟大家分享:

下面这段程序在VC6里面运行是会报运行时错误,内存读取violation。

然后问题是:(1)在tc里面运行没问题

                         (2)把a,b的定义改成a[10],b[10] 也可以成功运行。

这个问题的解答是:

内存读取错误的原因是在程序中读取常量区数据,而常量区数据是不可修改的。我们直接在程序中写的char *a = "student"; 只是定义了一个指向常量区的指针,也就是说编译器会在常量区分配空间给字符串。而用数组则不然,是在变量区也就是我们俗称堆的地方来分配空间。

而对第一个问题的解释是:

C编译器的版本问题。TC是遵循早期的编译规范C89,未对常量修改进行定义,因此可以通过。而vc6属于后期的编译器版本,对常量修改进行了禁止,因此就无法通过了。

Code:
  1. #include <stdio.h>  
  2.   
  3. char* mystrcpy(char*, const char*);  
  4.   
  5. void main()  
  6. {  
  7.     char *a = "student";  
  8.     char *b = "monday";  
  9.       
  10.     mystrcpy(a,b);  
  11.   
  12. }  
  13.   
  14. char* mystrcpy(char* pDest, const char* pSrc)  
  15. {  
  16.  assert((pDest != NULL) && (pSrc != NULL));  
  17.  char *pTmp = pDest;  
  18.  while ((*pDest++ = *pSrc++) != '/0')  
  19.   ;  
  20.  return pTmp;  
  21. }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值