用户登录
用户注册

分享至

impala字符串函数

  • 作者: 亖呉?盀
  • 来源: 51数据库
  • 2020-09-27
虽然没出错,但是很危险

strcpy(st1,st2);
这一句的作用是:
将以st2为起始位置,后面遇到的第一个'\0'为终了位置的字符串,
拷贝到以st1为起始位置的存储区域中。

只要st1和st2的存储空间不出现重叠编译器就不会显式的报错,
只要st2没有拷贝完,就会一直向st1打头的空间写下去,
这样一般就会有两个结果:
1. 正好st1后面的区域也没有被使用,拷贝正常完成
2. 拷贝到一个位置,正在被系统或者其他程序使用,出现异常错误,报错

你碰上的是第一种情况

至于puts(st1);能输出Language呢?
puts函数只管输出以st2为起始位置,到后面遇到的第一个'\0'之间的字符,
所以当然就正常输出了



  st1是数组,那么数组名就是一个地址,相当于一个指针的意义
而strcpy是一个字符串处理函数 里面的参数都是地址,根本不会去考虑长度
只要首地址正确,'\0'正确 就能够输出



  因为 b在定义时是以数组的形式定义的,已经分配了4个字节的空间,
指针 p 定义时并没有赋值,就是没有指向任何有效的空间,是野指针

直接执行 strcpy(p,a);
当然就错了



  你这样做:
将7改成6,试试
将6改成5,试试
将5改成4,试试
...
看你能坚持到什么时候 ^_^



  strcpy是一个不安全的函数,它不会考虑st1的长度,上面的程序已经内存越界了,有可能会造成不可意料的后果。

建议使用strncpy函数

char * strncpy(char *s1,char *s2,size_t n);
将字符串s2中最多n个字符复制到字符数组s1中,返回指向s1的指针。

可以保证内存不被越界
软件
前端设计
程序设计
Java相关