#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int i = 0; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; for (i = 0; i <=12; i++) { arr[i] = 0; printf("hehen"); } return 0; }//死循环打印hehe
- 这里vs环境下---i与arr之间有两个空间
- vc6.0下---i和arr之间是连续的
- gcc下---i和arr之间有一个空间
所以这个代码是严格依赖环境的
- i<=10或i<=11时程序只会报错--越界访问
- 当i<12时程序直接进入死循环,来不及报错
注意:这里i如果比arr后创建,那么只会造成越界访问,不会死循环。
- 上面的这些现象都是在debug版本中发生的
- 在release版本中,代码可以得到很好的优化,默认会把i放在arr后面创建,不会产生越界访问
下面是 strcpy函数的模拟实现和const修饰指针的用法
#define _CRT_SECURE_NO_WARNINGS 1 #includestrcpy--字符串拷贝函数的实现 #include int main() { char arr2[] = "hello"; char arr1[20] = { 0 }; strcpy(arr1, arr2); printf("%sn", arr1); return 0; } 模拟实现strcpy函数 void my_strcpy(char* dest, char* src) { while (*src != ' ') { *dest = *src; dest++; src++; } *dest = *src; } int main() { char arr2[] = "hello"; char arr1[20] = { 0 }; my_strcpy(arr1, arr2); printf("%sn", arr1); return 0; }//10分只能拿5分 #include void my_strcpy(char* dest, char* src) { assert(dest && src); while ((*dest++ = *src++) != ' ') { ; } } int main() { char arr2[] = "hello"; char arr1[20] = { 0 }; my_strcpy(arr1, arr2); printf("%sn", arr1); return 0; } #include char* my_strcpy(char* dest, const char* src)//这里加const修饰--确保src原数据不被改变 { assert(dest && src); char* ret = dest; while ((*dest++ = *src++) != ' ') { ; } return ret; } int main() { char arr2[] = "hello"; char arr1[20] = { 0 }; printf("%sn", my_strcpy(arr1, arr2));//链式访问--函数中访问函数 return 0; }//10分代码 const用法 const修饰变量时--常变量 const修饰指针的时候 const放在*的左边 eg:const int *p int const *p//两种写法含义一样 const修饰的指针指向的内容,表示指针指向的内容不能通过指针来改变 但是指针变量本身是可以被修改的 const放在*的右边 eg:int*const p const修饰的指针变量本身,指针变量的内容不能被修改 但是指针指向的内容可以通过指针来改变
指针的大小都是4个字节(32位)或8个字节(64位)



