#include <stdio.h> int main() { int i = 0; int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i <= 12; i++) { printf("hehe\n"); arr[i] = 0; } //getchar(); return 0; }
内存有栈区,堆区,静态区,栈区存放局部变量。栈区的默认使用,先使用高地址处的空间,再使用低地址处的空间。数组的下标的增加,地址由低到高变化,正式因为栈区的使用是先用高地址再用低地址,因此数组超出范围以后的地址会往i所在的地址方向走,当超出范围的数组元素来到和i同一个地址,而且被赋值为0时,下一轮循环就开始了,而且进入了死循环。VC6.0下面<=10就会死循环。gcc编译器<=11 就会死循环。vs2013 <=12 死循环。这个时候在Release版本下进行调试会发现,会将代码优化,将内存结构进行优化,i的地址是小于arr的地址的。 这个是把对于i的定义放在arr以后显示的报错 libpng warning: iCCP: cHRM chunk does not match sRGB,本人使用的编译器是MSVS2019。c++
1.代码运行正常
2.bug少
3.效率高
4.可读性好
5.可维护性高
6.注释清晰
7.文档齐全
常见的coding技巧
1.使用assert
2.尽可能使用const
3.养成良好的编码风格
4.添加必要的注释
5.避免编码的陷阱数组
#include <stdio.h> #include <assert.h> //void my_strcpy(char* des, char* src) //{ // while (*src!='\0') // { // *des = *src; // *des++; // *src++; // } // *des = *src; //} --6分 //void my_strcpy(char* des, char* src) //{ // while (*src != '\0') // { // *des++ = *src++; // } // *des = *src; //} //void my_strcpy(char* des, char* src) //{ // while (*des++ = *src++) // { // ; // } //} //妙哇 7分 可是没有考虑到输入有误的状况,好比输入一个空指针 void my_strcpy(char* dest, char* src) { assert(dest != NULL); assert(src != NULL); while (*dest++ = *src++) { ; } } //8分 int main() { char arr1[] = "***************"; char arr2[] = "hasaki"; my_strcpy(arr1, arr2); printf("%s\n", arr1); return 0; }
很烦的一点,当时调试的时候NULL一直显示未定义,查了以后说是须要stdio.h,我也引用了啊,,而后我就想到了C语言之中一直存在的语序问题,最后发现,这个头文件须要引用在NUL的使用以前,这个函数的优化还未完成,以后还会有更加好的版本ide