虽然没出错,但是很危险
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的指针。
可以保证内存不被越界
Hadoop|
Apache Pig|
Apache Kafka|
Apache Storm|
Impala|
Zookeeper|
SAS|
TensorFlow|
人工智能基础|
Apache Kylin|
Openstack|
Flink|
MapReduce|
大数据|
云计算|
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....