好了 。 终于又回归校园了。。 好吧,好好学习,天天日志。
记录一下一个问题,是这样的:
大家都知道自定义的strcpy,是很简单的一个函数。上次有位网友问了这样一个问题,我觉得非常有代表性,所以要记录下来跟大家分享:
下面这段程序在VC6里面运行是会报运行时错误,内存读取violation。
然后问题是:(1)在tc里面运行没问题
(2)把a,b的定义改成a[10],b[10] 也可以成功运行。
这个问题的解答是:
内存读取错误的原因是在程序中读取常量区数据,而常量区数据是不可修改的。我们直接在程序中写的char *a = "student"; 只是定义了一个指向常量区的指针,也就是说编译器会在常量区分配空间给字符串。而用数组则不然,是在变量区也就是我们俗称堆的地方来分配空间。
而对第一个问题的解释是:
C编译器的版本问题。TC是遵循早期的编译规范C89,未对常量修改进行定义,因此可以通过。而vc6属于后期的编译器版本,对常量修改进行了禁止,因此就无法通过了。
- #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;
- }