3个小例子说明下strcpy()与数组越界

1

Void test1()
{
      char string[10]; //甚至string[9]都可以!
      char *str1= "0123456789 ";
      strcpy(string, str1);
}
数组越界

strcpy()函数是对C风格字符串进行操作的函数,上例的str1是一个字符串,C风格的字符串以‘\0’结束,所以str1虽然看上去只有10个字符,但实际上应加上‘\0’,即应为11个字符,而string数组只有10个元素,而strcpy()函数的实现是遇'\0'而停止拷贝,所以拷贝时实际上是把‘\0’也进行了拷贝,这就导致string数组越界拷贝。
--------------------------------------------------------------------------
2

Void test2()
{

       char string[10], str1[10];
       for(i=0; i <10;i++)
       {
             str1[i] = 'a ';
       }
       strcpy(string, str1);
}
数组越界

如例1,上例说过strcpy()函数是多C风格的字符串进行拷贝,即遇‘\0’而停止拷贝,而本例中str1不是C风格的字符串,而是一个char数组,不是以'\0'结束的,所以strcpy()函数会一直进行拷贝直到遇到第一个'\0'才结束拷贝,所以string越界是必然的,因为我们不知道什么时候遇到'\0'。
--------------------------------------------------------------------------
3.
Void test3(char* str1)
{
       char string[10];
       if(strlen(str1) <=10)
       {
       strcpy(string, str1);
       }
}
数组越界

本例str1是一个字符串指针,这里就要说到strlen()函数了,strlen()是计算C风格字符串字符长度的函数,虽然说是计算字符长度,但是实际上计算的只是有效可见字符长度,即不计算'\0',所以本例中如果strlen(str1)计算的长度为10的时候事迹上str1是11个字符,所以拷贝时同样会出现11个字符拷贝到string数组中的情况发生,即会数组越界。

        通过上面三个小例子简单介绍了数组越界的问题,以及C风格字符串部分函数的使用:数组越界时编辑器不会报错,编译器不检查数组越界,strcpy()函数是针对C风格字符串进行拷贝的,即遇'\0'而停止拷贝,strlen()函数只拷贝字符串的实际显示的字符长度,而不包括'\0'字符,所以使用时,可能会因为不注意而出错。这里的介绍也不是很全面,只是遇到了就写一下而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值