我们真的走心技术了吗(1)
上次的项目已经交付成功,今天翻看自己的幕布笔记,发现自己曾经犯过好多小错误,很多人现在遇到问题就百度下,只要问题解决了就ok,之前的我有时候也会这样,但越来越发现这样是不行的,故决定把自己过去没走心的语法知识重新拾起,像一名初学者一样,认真的记录每一次错误,认真的记录每一次解决方案(大佬可跳过),加油吧每一位在奋斗路上的码农。
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 char str1[10] = {0}; 7 char* str2 = "0123456789"; 8 strcpy(str1, str2); 9 cout << "str1:" << str1 << endl; 10 11 system("pause"); 12 return 0; 13 }
先来看看这么简简单单的九行代码,有什么问题呢?打印出str1的值后,程序会崩溃:stack around the variable “str1” was corrupted.
代码分析:“0123456789”,这是什么?!这是字符串啊,字符串是以“\0”结尾的,也就是说,str2需要11个字节的空间,而str1是字符数组,长度为10,它仅需10个字节的空间便足够了,我们在利用strcpy函数时,会造成数组越界,导致程序崩溃。
再看个例子,如下:
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 char str1[10],str2[10]; 7 8 for (int i = 0; i<10; i++) 9 { 10 str2[i] = 'a'; 11 } 12 strcpy(str1, str2); 13 14 system("pause"); 15 return 0; 16 }
str2不能在数组内结束,strcpy(str1, str2)调用使得从str2内存起复制到str1内存起所复制的字节数具有不确定性,strcpy函数用的时候一定要小心啊~
那我们自定义strcpy函数:
1 char * strcpy( char *strDest, const char *strSrc ) 2 { 3 assert( (strDest != NULL) && (strSrc != NULL) );//判断源地址和目的地址 4 char *address = strDest; 5 while( (*strDest++ = * strSrc++) != ‘\0’ ); 6 return address; 7 }
还有很多很多这样细小的错误和问题,打算一点一点的整理下来,如有不对的地方,还望指正呦~O(∩_∩)O