首页 > 范文大全 > 正文

在C程序设计中注意字符串操作的越界问题

开篇:润墨网以专业的文秘视角,为您筛选了一篇在C程序设计中注意字符串操作的越界问题范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:在C程序设计中数组或串的越界访问是难以发现且相当危险的,因为它可能改变了其他存储空间的内容。C++语言在编译或运行期间均不报告这一类型的错误,所以关于指针或数组的错误特别难以调试,初学者一定要注意这种陷阱。

关健词:静态存储结构;动态存储结构;越界访问

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)18-4223-02

字符串的存储结构有两种:一种是顺序存储结构,又称静态存储结;另一种是链式存储结构,又称动态存储结构。静态存储结构有两个缺点:一是需预先定义一个串允许的最大字符个数,当该个值估计过大时,浪费空间较大;二是限定了串的最大字符个数,使串的某些操作如复制、连接等受到很大限制与影响。数组或串的越界访问是难以发现且相当危险的,因为它可能改变了其他存储空间的内容。C++语言在编译或运行期间均不报告这一类型的错误,所以关于指针或数组的错误特别难以调试,初学者一定要注意这种陷阱。

1 关于字符串变量操作中的越界问题

字符串变量是一个基类型为字符类型的数组变量,其定义的一般形式为:

char 数组名[元素个数];

在声明字符串变量时,可用字符常量进行初始化,如:

char name[30]=”Zhongshan University”;

这时编译程序会为字符串为题name分配30个字节的存储空间,并将”Zhongshan University”中20个字符的ASCII码存储在前20个字节中,然后在第21个字节中存放一个’\0’表示串结束,至于第22个至30个字节是什么内容是不关心的。字符串变量占用的存储空间大小与其中存放的字符串的长度之间没有相等关系,尽管name中存放的字符串长度为20,实际使用了21个字节,但它仍然占用着30个字节存储空间。

鉴于上述存储空间组织形式,在初始化字符串变量时一定要注意字符串长度不要超过其存储空间的大小,如:

char name[20]= ”Zhongshan University”;

可能会引起严重问题,因为字符串的结束标志’\0’超出了为它分配的存储空间边界,可能破坏其他数据。但C++语言在编译或运行期间均不报告这一类型的错误,所以关于指针或数组的错误特别难以调试。

为了避免上述字符串越界错误,解决办法是:不必声明字符数组的长度,而由编译程序根据初始化的字符串常量的长度自动决定。如:

char name[]= ”Zhongshan University”;

对于这个声明,编译程序会根据字符串常量的长度为name分配21个字节,相当于

char name[21]= ”Zhongshan University”;

2 关于字符串库函数操作的越界问题

与其他类型的数组一样,只可在声明字符串变量时用赋值运算作初始化,在其他地方不允许直接使用赋值运算,如:

char name[30];

name= ”Zhongshan University”; //语法错误

因为name实际上是一个常量指针,不可用赋值语句改变其值,即name不允许作为一个“左值”。

1)字符串复制函数

char * strcpy(char * str1,const char * str2);

功能:将str2指向的字符串复制到str1指向的位置中并返回str1。

注意:为str1分配的存储空间必须能放得下str2指向的字符串。

以下是初学者常犯的错误:

char * str;

strcpy(str,”Be careful.”); //可能引起严重的问题

因为str所指向的存储空间地址是不确定的,还没有让这个指针指向一块已分配到的存储空间。然而以下用法却是正确的:

char * str;

str=”Be careful.”;

因为字符串常量已经分配了存储空间,赋值后指针str指向这一空间。另一用法也是正确的:

char str[20];

strcpy(str,”Be careful.”);

因为str已经静态地分配了20个字节的空间,所以可以将字符串常量复制到这一存储空间。注意:为str静态或动态申请的存储空间大小不可小于12个字节,否则会出现越界写入错误。

2)字符串连接函数

功能:将字符串str2连接到字符串str1后,形成一个新的字符串,原先str1的结束标记’\0’被取消,函数返回值为str1。

注意:为字符串变量str1分配的存储空间一定要足够大,能够容纳两个字符串连接后的新字符串。

执行传统的复制或连接函数是有风险的,因为str1所指字符串所分配的空间不够大时,指针str2所指字符串复制或连接过来就造成了越界错误。数组或字符串的越界访问是难以发现且相当危险的,因为它可能改变了其他存储空间的内容。

3 解决的办法

利用动态存储空间申请new和动态存储空间撤消delete,根据实际需要合理地分配存储空间。

1)改进后的新字符串复制函数:

总之,我们在实际的C程序设计中一定要警惕数组或字符串的越界访问问题,这样一方面可以让我们避开C程序设计中编译或运行期间的麻烦与风险,另一方面可以让我养成良好的编程习惯,从而提高编程效率。

参考文献:

[1] 李师贤,李文军,周晓聪,等.面向对象程序设计基础[M].2版.北京:高等教育出版社,2005.

[2] 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2005.