Debug和Release
#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。
优秀代码的标准
1.代码运行正常
2.bug少
3.效率高
4.可读性好
5.可维护性高
6.注释清晰
7.文档齐全
常见的coding技巧
1.使用assert
2.尽量使用const
3.养成良好的编码风格
4.添加必要的注释
5.避免编码的陷阱
模拟实现strcpy
#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的使用之前,这个函数的优化还未完成,之后还会有更加好的版本
来源:oschina
链接:https://my.oschina.net/u/4302631/blog/4927421