我们真的走心技术了吗(1)

时间:2021-03-26 08:31:57

  上次的项目已经成功交付,今天翻看自己的幕布笔记,发现自己曾经犯过好多小错误。现在很多人遇到问题就百度下,只要问题解决了就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