关于"ucrtsed.dll"错误提示的一些了解
在C++使用一些C语言的函数是老是出点问题,百度起来就是上面一起大佬在说先学会调试,看懂错误提示,真的比比一句要是会调试,看得懂错误提示还来百度,自己太渣了,只能一点一滴的学习,大佬也不是一个一个坑踩过来到,感觉这群大佬啥心态啊。
先看问题:
一个大红叉加一个“已引发异常”,错误来自于“ucrtbased.dll”,开始还以为编译器组件问题,毕竟看到“.dll”还以为是电脑坏了,其实不是主要还是代码的问题。
此时的程序并没有直接退出,并且,也编译通过,关键在于——
两个地址的传值出错了!
也就是在传值的时候访问冲突了,其实最恰当的说话是“内存访问越界”,小伙伴们百度这个关键词才是最恰当的。
我们知道在语言中需要由键盘输入一个数据给一个变量赋值通常使用scanf函数,在C++中也是可以兼容C语言的函数的,所以在C++中也使用“scanf”函数。但是,使用的时候编译器会提示你数据不安全,原因就是因为“scanf”函数不会检查边界,这对于高版本的编译器来说是致命错误,所以通常,编译器无法编译成功。
“内存访问越界”简单点说就是用户定义的变量是5个字符空间,但是在用户输入字符时却输入了10个字符,包括”\0“在内,其实用户已经多输入了6个字符,而我们的”scanf“函数不会检查你是否越界了,所以多输入的字符它也会接受,但是,多出来的字符要放哪里?他会放到别的变量空间去,这就是“内存访问空间越界”,这通常指定是字符数组,这和计算机存储方式有关,而对于基本类型的数据成员来说,越界代表输入的数值大于这类数据可表示的最大数据上线,在程序开发时,使用数据类型也考虑的也就是这个问题,程序员考虑了基本也就不会有问题,但是对于字符数组的越界是很多时候没有考虑的
//例如:分配了8字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节
char buf[8];
scanf("%s", &buf);
//如果输入1234567890,则7以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。
在visual Studio 2019这类高版本的开发环境中会有安全的“scanf”函数,也就是”scanf_s“函数:
char buf[8];
scanf_s("%s", &buf,8); //最多读取4个字符,因为buf[4]要放'\0'
//如果输入1234567890,则buf只会接受前7个字符
“scanf_s”函数的使用中对与数组长度需要进行说明,也就是在变量的后面加入数组的具体长度。
对于使用动态分配到数组,当然是使用“cin”流来赋值啦,毕竟都是C++语言的函数定义的,问题就不会那么多。
对于C++的安全问题基本都是“内存访问越界”,所以遇到时就应该想如何转化为安全模式下使用了。