自定义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;
}
记录一下一个问题,是这样的:
大家都知道自定义的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;
}
相关文章推荐
- 是陷阱还是机遇,《赢在中国》背后只有一双手么?
- 如何判断一个类是系统的类,还是自定义的类
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)里面的坑之 同一个controller部分方法可以拦截,部分方法拦截不了
- 是陷阱还是机遇,《赢在中国》背后只有一双手么?
- 自定义日志阅读器——包括了一个load取Tomcat日志的分析器
- Python:通过自定义系统级快捷键来控制程序开始或停止记录日志(使用小技巧解决一个貌似无解的问题)
- Python:通过自定义系统级快捷键来控制程序开始或停止记录日志(使用小技巧解决一个貌似无解的问题)
- Debug日志:C++中的一个switch-case陷阱
- 团购网站兴盛的背后:是美味馅饼还是知名陷阱
- 【活动】今晚“吃鸡”还是“农药”,游戏背后的程序员告诉你如何造就一个好游戏?
- 一个简单的自定义程序日志小样例
- 是陷阱还是机遇,《赢在中国》背后只有一双手么?
- 自定义一个python日志类
- 一个简单的自定义程序日志小样例
- C#2005 一个简单的写日志类
- 你也可以自己写一个可爱 & 小资风格的Android加载等待自定义View - 转
- 判断一个变量是无符号的还是有符号
- 是做一个 Universal 应用好,还是分开做成 iPhone iPad 两个版本好?
- 一个小程序背后的故事——分段