您的位置:首页 > 其它

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

2009-10-11 17:10 375 查看
好了 。 终于又回归校园了。。 好吧,好好学习,天天日志。

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

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

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

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

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

这个问题的解答是:

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

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

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

Code:

#include <stdio.h>



char* mystrcpy(char*, const char*);



void main()

{

char *a = "student";

char *b = "monday";



mystrcpy(a,b);



}



char* mystrcpy(char* pDest, const char* pSrc)

{

assert((pDest != NULL) && (pSrc != NULL));

char *pTmp = pDest;

while ((*pDest++ = *pSrc++) != '/0')

;

return pTmp;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: