C中遇到的一些问题总结
此篇随笔总结一下各种情况下关于C语言的问题。
1.atoi函数只能处理C风格的字符串
atoi函数接收一个const char*的参数返回一个int。atoi函数只能处理结尾为/0的C风格字符串,如果输入为一个普通char的引用,会产生运行时错误,内存溢出,访问越界了。因此使用auto for遍历string时也不能在循环中不加处理的使用atoi函数。
string s; for(auto c:s) { int i=atoi(c); //内存泄漏,atoi函数会越界访问 } char c=1; int i=atoi(&c); //内存泄漏
2.C++编译器会对长的整形算数式进行拆分优化(不包括浮点运算float,double)
x=a+b+c; y=b+c+d; //编译器可能会优化为下式来减少一个加法操作 t=b+c; x=a+t; y=t+d;
这么做是因为整形字符满足结合律,而浮点运算不满足结合律。
x=a+b+c; a+b=NaN; NaN+c=NaN 则 x=NaN; 若结合律会导致错误 b+c!=NaN并且a!=NaN; 则 x!=NaN //结果错误

浙公网安备 33010602011771号