#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int 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("hehe\n");
}
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
#include<stdio.h>
strcpy--字符串拷贝函数的实现
#include<string.h>
int main()
{
char arr2[] = "hello";
char arr1[20] = { 0 };
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
模拟实现strcpy函数
void my_strcpy(char* dest, char* src)
{
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;
}
int main()
{
char arr2[] = "hello";
char arr1[20] = { 0 };
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}//10分只能拿5分
#include<assert.h>
void my_strcpy(char* dest, char* src)
{
assert(dest && src);
while ((*dest++ = *src++) != '\0')
{
;
}
}
int main()
{
char arr2[] = "hello";
char arr1[20] = { 0 };
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
#include<assert.h>
char* my_strcpy(char* dest, const char* src)//这里加const修饰--确保src原数据不被改变
{
assert(dest && src);
char* ret = dest;
while ((*dest++ = *src++) != '\0')
{
;
}
return ret;
}
int main()
{
char arr2[] = "hello";
char arr1[20] = { 0 };
printf("%s\n", 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位)