通过学习VS调试debug,了解到一名优秀的程序员是一名优秀的侦探
程序员写代码在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("hello \n");
arr[i] = 0;
}
return 0;
}
在vs2019中 通过监视我们可以发现
由于局部变量放在内存中的栈区,栈区的使用习惯是由低地址向高地址使用
随着数组下标的增长,地址由低到高变化
在vs2019 i和arr之间2个整型 i <= 12
在vc6.0 i和arr之间无空间 i <= 10
在gcc i和arr之间1个整型 i <= 11
下面是模拟实现strlen 代码如下
//实现打印字符串
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* arr)//返回类型是size_t 与原库函数返回类型一样
//conust 表示对*str进行限制
{
assert(*arr!= NULL); //断言 如果为假则提醒程序将报错 如果为真,则无影响
size_t count = 0;
while (*arr++ != '\0')
{
count++;
}
return count;
}
int main()
{
char* arr = "abcdeft";
printf("%d", my_strlen(arr));//链式访问
return 0;
}
运行结果如下
下面是模拟实现strcpy函数
//实现库函数strcpy函数 对字符串拷贝
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* source)//起初的变量放在 最后
{
assert(dest && source);
// //assert中可以放一个表达式,表达式的结果如果为假,就报错,如果为真啥事都不发生
// //assert 其实在release版本中优化了
char* ret = dest;
while (*dest++ = *source++)
;
return ret;
}
int main()
{
char arr1[80] = {0};
char* p = "hello";
printf("%s\n", my_strcpy(arr1, p));//把p放在arr1中 源头 终点
return 0;
}
注意常见的错误:编译型错误 链接型错误 运行时错误