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的使用之前,这个函数的优化还未完成,之后还会有更加好的版本