动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.如何在RichEdit中实现上标下标.
.API之位图、图标和光栅运算函数.
.ASPDotNet.
.c++学习计划.
.小心C++编译器给我们带来的麻烦.
.C++编程易范的错误.
.C++单继承.
.C++语言简介.
.Windows编程基础 - 文.
.获取GetLastError返回信息.
.如何给Table减肥.
.C++数据结构学习:事件驱动模拟.
.程序配置信息的保存.
.“笑”傲流媒体―SMIL基础教程.
.C++ STL编程轻松入门.
.C++代码优化方法(1).
.实例解析C++/CLI的串行化.
.daemon实例.
.在Tc2.0下的鼠标控制程序.
.进程调度模拟程序.

C/C++编程新手错误语录(续二)

发表日期:2008-3-8 |


前文回顾:C/C++编程新手错误语录  错误语录(续一)(13)“整型变量仅仅意味着一个整数”
  当我们还是一个新手,看整型就是整数;

  当我们成为高手,看什么都是整型。

  整型,在所有C/C++基本数据类型中最富有艺术魅力和奇幻色彩。

  我们从某闻名论坛的一篇帖子开始一窥整型的奥妙。

  问:Vxworks操作系统启动一个任务的函数是taskSpawn(char* name, int priority, int options, int stacksize, FUNCPTR function, int arg1,.. , int arg10),它只接受整型参数,我该怎么办才能给它传一个结构体(在32位PowerPC平台下)?

  答:可以传入结构体的指针,在32位PowerPC平台下,指针本质上就是一个32位整数,在函数体内将整型强制转化为结构体指针就可访问结构体的每一个元素。

  如:
//启动任务1
taskSpawn(“task1”, 180, NULL, 10000, Task1Fun, &pStrUCtAr,0,0,0,0,0,0,0,0,0);
//task1函数
Task1Fun ( int arg1 )
{
struct_x * pStructx = (struct_x *) arg1; //将整型强制转化为结构体指针

}
  在此提出“泛整型”的概念,(unsigned)char、(unsigned)short int、(unsigned)int、(unsigned)long int等都属于这个范畴,指针必然属于“泛整型”的范围。用指针的高超境界,也为将其看做一个“泛整型”。

  看看软件的具体设计文档,其数据结构定义部分经常看到“INT8、UINT8、INT16、UINT16、INT32、UINT32、INT64、UINT64”或“BYTE、Word、DWORD”等数据类型,它们在本质上都是(unsigned)char、(unsigned)short int、(unsigned)int、(unsigned)long int宏定义的结果,都属于“泛整型”。所以,“泛整型”的概念真实地体现在日常的软件设计当中。

更多文章 更多内容请看C/C++技术专题  Java编程开发手册专题,或
  正因为各种指针类型在本质上都是“泛整型”,因此它们可以互相转化:
int a, b;
memset( (char*) &a, (char*) &b, sizeof(int) );
  等价于:
int a, b;
a = b;

  从来没有人会用memset( (char*) &a, (char*) &b, sizeof(int) )来代替a = b,这里只是为了说明问题。下面的代码则经常用到:
int *p = (int *) malloc(100*sizeof(int));

memset ( p, 0, 100*sizeof(int) ); //将申请的内存空间清0
  我们看memset的函数原型为:
void * memset ( void * buffer, int c, size_t num );
  实际上它接受的第一个参数是无类型指针,在memset函数体内,其它任意类型的指针都向void *转化了。类似的内存操作函数memcpy所接受的源和目的内存地址也是无类型指针。

  char *转化为int *后的值虽然不变(还是那个地址),但是其++、--等操作的含义却发生了变化,这也是要注重的。
char *p;
++p;
  与
char *p;
++(int *)p;
  的结果是不一样的,前者的p值加了1,而后者的则增加了sizeof(int)。

  下面来剥Windows程序设计中消息传递函数两个参数的皮,看看它们究竟是什么:
typedef UINT WPARAM;
typedef LONG LPARAM;
  原来,WPARAM和LPARAM其实都属于“泛整型”,所以不要报怨消息处理函数只能接受“泛整型”。实际上,从指针的角度上来讲,在C/C++中,可以获得任何类型实例(变量、结构、类)的指针,所以Windows的消息处理函数实际上可以接受一切类型的参数。

  惊天动地一句话:“泛整型”可表征一切。

更多文章 更多内容请看C/C++技术专题  Java编程开发手册专题,或
(14)“值传递一定不会改变参数”

  理论而言,值传递的确不会改变参数的内容。但是,某年某月的某一天,隔壁Office的硕士mm写了这么一段程序,参数的值却被改变了:
int n = 9;
char a[10];
example ( n, a ); //调用函数example(int n,char *pStr)
printf (“%d”, n );  //输出结果不是9
  大概整个office的人都被搞懵了,都说编译器瞎搞,有问题。找到笔者,笔者凭借以往的经常,一眼就看出来不是什么编译器出错,而是在函数example内对字符串a的访问越界!

  当在函数example内对a的访问越界后,再进行写操作时,就有可能操作到了n所在的内存空间,于是改变了n的值。

  给出这个语录,并非为了推翻“值传递不会改变参数”的结论,而是为了从侧面证实在C/C++语言中,数组越界是多么危险的错误!

  下面的两个函数有明显的数组越界:
void example1()
{
char string[10];
char* str1 = "0123456789";
strcpy( string, str1 );
}
void example 2(char* str1)
{
char string[10];
if( strlen( str1 ) <= 10 )
{
strcpy( string, str1 );
}
}
  而这个函数的越界就不这么明显:
void example3()
{
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1[i] = 'a';
}
strcpy( string, str1 );
}
  其实,这个函数危险到了极点。因为对于strcpy函数而言,拷贝的时候要碰到’\0’才结束,str1并没有被赋予结束符,因而你根本就不知道strcpy( string, str1 )的结果究竟会是拷贝多大一片内存!

  遗憾的是,C/C++永远不会在编译和连接阶段提示数组越界,它只会在运行阶段导致程序的崩溃。

  数组越界,是大多数C/C++编程新手常犯的错误,而它又具有极大的隐蔽性,新手们一定要非凡注重。

更多文章 更多内容请看C/C++技术专题  Java编程开发手册专题,或
(15)“C不高级,学C++、JAVA、C#才够味”

  也许谭浩强老师的C语言教材是绝大多数高校学生学习的第一门编程课程,所以在许多学生的心目中,觉得C是一种入门级的语言,他们舍弃基础而追逐花哨的Visual XXX、Java、ASP、PHP、.net,他们以为这样做“赚大了”。


  非也!

  C是一种多么富有魅力的语言!在今时的绝对多数底层开发中,仍然几乎被C完全垄断。这些领域包括操作系统、嵌入式系统、数字信号处理等。舍弃C的经济基础搭.net的高层建筑实在是危险。

  我们总是以为自己把握了C,那么请写一个strcpy的标准函数。您的答案若是:
void strcpy( char *strDest, char *strSrc )
{
  while( (*strDest++ = * strSrc++) != ‘\0’ );
}
  很遗憾,您的程序只能拿到E。看看拿A的strcpy:
char * strcpy( char *strDest, const char *strSrc )
{
 assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
 while( (*strDest++ = * strSrc++) != ‘\0’ );
return address;
}
  这个程序考虑了什么?

  (1)程序要强大:为了实现链式操作,将目的地址返回,函数返回类型改为char *

  (2)程序要可读:源字符串指针参数加const限制,表明为输入参数

  (3)程序要健壮:验证strDest和strSrc非空

  假如这三点中您只考虑到0点或1点,那么请回家好好修炼一下C。因为这个最简单的strcpy已验证出您的C语言基础只能叫做“入门”。

  再写个简单的strlen,这么写就好了:
int strlen( const char *str ) //输入参数为const
{
assert( strt != NULL ); //断言字符串地址非0
int len;
while( (*str++) != '\0' )
{
len++;
}
return len;
}
  由此可见,写好这些简单的函数也需要深厚的基本功,永远不要放弃对基本功的培养。

更多文章 更多内容请看C/C++技术专题  Java编程开发手册专题,或
(16)“语言学得越多越好”

  许多的初学者都经历过这样的一个阶段,面对大量的编程语言和开发环境,他们俩感到难以取舍,不知道自己究竟应该学习什么。于是他们什么都学,今天看一下Visual Basic,明天看学一下C++,后天在书点看到了本Java便心血来潮买回来翻翻,大后天又发现必须学.net了。他们很痛苦,什么都在看,结果什么都没学会,忙忙碌碌而收获甚微。

  我们真的没有必要在什么语言都不甚精通的情况下乱看一气。认准了一种真正语言就应该坚持不懈地努力。因为任何一门语言的把握都非一朝一夕一事,笔者从六年前开始接触C++,直到现在,每一阶段仍有新的启发,在项目开发的过程中也不断有新的收获。今日我还是绝对不敢宣称自己“精通”这门语言。

  许多刚毕业的大学生,动不动就在简历上写上自己精通一堆语言。与之相反,大多数优秀的工程师都不敢这么写。也许,研究越深,便越敢自身的无知。

  在下认为,一个成熟的语言体系应该是:
  程序员的语言体系 = 一种汇编 + C + 一种面向对象(C++、JAVA、C#等)

  假如还要加,那就加一种解释型语言,perl或tcl(也许其它)。

  语言具有极大的相似性,从C++过渡到JAVA只需要很短的一段时间。各种语言的发展历史也体现了编程思想的发展史。我们学习一种语言,语法也许并不是最重要的,最重要的是蕴藏在语法外表下的深层特性和设计用意。

  本回书着落此处,更多错误语录,当然是待续。
更多文章 更多内容请看C/C++技术专题  Java编程开发手册专题,或
上一篇:对C++递增(增量)运算符重载的思考 人气:274
下一篇:精华:C++编程新手错误语录(续一) 人气:377
浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵