C语言新手问题//、、。。。。。。。。。

#include"stdio.h"
#include"stdlib.h"
int main()
{
    char x[10]="abcdefg" ;
    char w[2];
    sprintf(w,"%s",x);
    puts(w);

 

为何没有报错呢?w的总长要比x的总长小,为何输出的w还是 abcdefg 

对w 的赋值已经用到了未申请的空间,为何不报错。。。。。。。

sprintf使用的参数都是指针,所以是不会去管这个指针指定的内存地址到底有多大,按照字符串来算,一定会找到‘\0’才会结束,所以相当于将x开始到‘'\0’的所有数据复制到了w[0]开始的地址上,而不会去管w的存储空间够不够,并且由于是指针,所以编译器也不会去报错。这就是sprintf不安全的地方。日常建议使用snprintf,可以限定目标内存的大小。

栈上的数据已经被覆盖了,已经破坏了。

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html