当前位置: 首页 > news >正文

优质的中小型网站建设焦作市住房和城乡建设局网站

优质的中小型网站建设,焦作市住房和城乡建设局网站,网站怎么做域名解析,加强经管学院网站建设#x1f534;本文章是在 Visual Studio 2022#xff08;VS2022#xff09;编译环境下进行操作讲解 文章目录3.2.调试的时候查看程序当前信息3.2.1.查看临时变量的值3.2.2.查看内存信息3.2.3.查看调用堆栈3.2.4.查看汇编信息#x1f973;4.调试实例#x1f973;5.如何写出本文章是在 Visual Studio 2022VS2022编译环境下进行操作讲解 文章目录3.2.调试的时候查看程序当前信息3.2.1.查看临时变量的值3.2.2.查看内存信息3.2.3.查看调用堆栈3.2.4.查看汇编信息4.调试实例5.如何写出易于调试的代码5.1.模拟实现库函数 strcpy5.2. const 修饰指针6.编程常见的错误3.2.调试的时候查看程序当前信息 3.2.1.查看临时变量的值 自动窗口 调试–窗口–自动窗口 它会出现一个自动窗口它会自动捕获变量的值让你监视方便的我们不用手动添加变量但是如果它不想让你看的时候过了一会就会自动取消了我们就监视不到了 局部变量 在自动窗口的下面 与自动窗口比较相似但不同的是放的是局部变量监视的是程序执行中的局部变量 监视 调试–窗口–监视 这才是我们用到最多的调试功能 我们想监视谁就输入谁它不会自己取消会一直显示来为我们提供对变量的监视 数组也可以观察变量的地址也都可以观察到 如果有需要可以同时打开4个监视窗口每个窗口都可以拖动放到你想放的位置 3.2.2.查看内存信息 内存 调试–窗口–内存 ☝️内存中本放的是二进制的数据但是为了展示方便所以是以十六进制来显示的☝️ 3.2.3.查看调用堆栈 调用堆栈 调试–窗口–调用堆栈 简单知道一下 什么是栈 看这段代码 调用堆栈 ☝️反映的是函数的调用逻辑☝️ 3.2.4.查看汇编信息 反汇编 在内存的下面 看到的是c语言代码翻译出来的汇编代码 4.调试实例 看下面这段代码 #includestdio.hint 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; }运行起来是什么样呢 数组已经越界了为什么没有崩溃而是死循环了呢 进入调试 i 等于9的时候一切都正常我们继续 这个代码真的是在越界访问胆大包天啊如果我们继续下一步呢 继续一直执行 再改 i 到12之后并没有变成13 i 再一直跟着 arr[12] 改变陷入了死循环这是为什么呢有没有可能它们是在同一个空间呢我们看一下 地址居然一摸一样它俩在一个空间 那么底层原理什么呢为什么会这样呢 原理 1. i 和 arr 是局部变量局部变量是放在栈区上的 2. 栈区内存的使用习惯是 使用高地址的空间再使用低地址处的空间 3. 数组随着下标的增长地址是由低到高变化的 5.如何写出易于调试的代码 优秀的代码 1. 代码运行正常 2. bug很少 3. 效率高 4. 可读性高 5. 可维护性高 6. 注释清晰 7. 文档齐全 常见的coding技巧 1. 使用assert 2.尽量使用const 3. 养成良好的编码风格 4. 添加必要的注释 5. 避免编码的陷阱 5.1.模拟实现库函数 strcpy 拷贝一个字符串 示例 #includestdio.h #includestring.hint main() {char arr1[] hello world;char arr2[20] { 0 };strcpy(arr2, arr1);printf(%s\n, arr2);return 0; }模拟实现 strcpy #includestdio.h #includestring.h void my_strcpy(char* dest, char* src) {while (*src ! 0){*dest *src;dest;src;}*dest *src; // \0的拷贝 } int main() {char arr1[] hello world;char arr2[20] { 0 };my_strcpy(arr2, arr1);printf(%s\n, arr2);return 0; }如果写成这样的代码这算一个好的代码吗当然不算一个好的代码我们可以优化一下 void my_strcpy(char* dest, char* src) {while (*src ! 0){*dest *src;}*dest *src; // \0的拷贝 }我们还可以再融合一下 void my_strcpy(char* dest, char* src) {while (*dest *src){;} }可以直接一次搞定 这样改进完好像已经足够好了但是我们还能再改进 void my_strcpy(char* dest, char* src) {if (dest NULL || src NULL){return;}while (*dest *src){;} }防止遇到空指针但是这样处理遇到问题只是回避掉了并不做处理 #includestdio.h #includestring.h #includeassert.h void my_strcpy(char* dest, char* src) {//断言assert(dest ! NULL);assert(src ! NULL);while (*dest *src){;} } int main() {char arr1[] hello world;char arr2[20] { 0 };my_strcpy(arr2, NULL);printf(%s\n, arr2);return 0; } 使用断言处理之后如果有问题它就会报错把问题抛出来并且告诉你出错在哪里如果不使用断言执行程序的话代码就崩掉了不会告诉你哪里有问题 断言是对程序员非常友好的东西我们使用断言是个很好的编程习惯 使用断言别忘记引用头文件 assert.h void my_strcpy(char* dest, char* src) {//断言assert(dest src);while (*dest *src){;} }简便一点可以直接写成这样☝️ 5.2. const 修饰指针 const修饰变量m之后m的值就更改不了了 但是可以使用一些小聪明把m改掉 int main() {const int m 10;//m 20;//errorint* p m;*p 20;printf(%d\n, *p);return 0; }这个代码非常奇葩因为 const 只是在语法层面限制了m不能改但是通过地址是可以更改的 我们可以在语法层面把指针p 也进行限制 int main(){int n 100;const int m 10;//m 20;//error//const 修饰指针//1. const放在*的左边,*p不能改了也就是p指向的内容不能通过p来改变了。但是p是可以改变的p可以指向其他变量const int* p m;p n;printf(%d\n, *p);return 0;} int main(){int n 100;const int m 10;//m 20;//error//const 修饰指针//2. const放在*的右边限制的是pp不能改变但是p指向的内容*p是可以通过p来改变的int* const p m;*p n;printf(%d\n, *p);return 0;} 1. const放在的左边,p不能改了也就是p指向的内容不能通过p来改变了。但是p是可以改变的p可以指向其他变量 2. const放在的右边限制的是pp不能改变但是p指向的内容p是可以通过p来改变的 void my_strcpy(char* dest,const char* src) {//断言assert(dest src);while (*dest *src){;} }所以上面模拟实现strcpy的代码这样写就更严谨了加上了 const 来修饰char* src 提高了代码的健壮性鲁棒性 因为如果下面的 *dest *src 位置要是不小心写反了程序就会报错所以这样写才是有意义的 我们再来进行最后一次优化 #includestdio.h #includestring.h #includeassert.h//strcpy函数返回的是目标空间的起始位置 char* my_strcpy(char* dest,const char* src) {//断言-- 保证指针的有效性assert(dest src);char* ret dest;//把src指向的字符串拷贝到dest指向的数组空间包括\0字符while (*dest *src){;}return ret; } int main() {char arr1[] hello world;char arr2[20] { 0 };//链式访问printf(%s\n, my_strcpy(arr2, arr1));return 0; } 这些都是一些技巧希望大家可以理解 6.编程常见的错误 优秀的代码 1. 编译型错误 直接看错误提示信息 解决问题或者凭借经验就可以搞定相对简单 2. 链接型错误 看错误提示信息主要在代码中找到错误信息中的标识符然后定位问题所在。一般是标识符名不存在或者拼写错误ctrl F 可以进行搜索 3. 运行时错误 借助调试逐步定位问题最难搞 做个用心的人积累排错经验 总结 本文章是在 Visual Studio 2022VS2022编译环境下进行操作讲解 以上就是调试技巧下篇内容啦 希望我们可以做一个用心的人 小的会继续学习继续努力带来更好的作品 创作写文不易还多请各位大佬uu们多多支持哦
http://www.dnsts.com.cn/news/189322.html

相关文章:

  • 做网站什么数据库用的多公司网站做百度广告如何报税
  • 网站域名重定向怎么做甜甜圈wordpress主题
  • 杭州置地电商基地网站建设做网站如何导入信用卡付款
  • 昆明学校网站设计公司mui做wap网站
  • 网站开发先写后端先写前端台州智能模板建站
  • 可以做推广的门户网站jquery网站发展历史时间轴
  • 网站建设和维护面试题烟台怎么做网站
  • 网站规划内容重庆企业服务建站网站开发
  • 移动网站开发语言wordpress开启多语言
  • 申请永久网站空间字体WordPress
  • 网络科技公司企业文化山东网站营销seo哪家好
  • 做威尼斯网站代理算是违法吗十大网络推广公司
  • 网站设计 收费网站代码免费下载
  • 动易门户网站价格动态效果酷炫的网站
  • 微信小网站怎么做wordpress 集成paypal
  • 服装网站ui设计建设厅网站的无法打印
  • 广州网站建设(信科网络)wordpress 主题选项
  • 装饰网站建设多少钱网站详情页用cdr做可以吗
  • 广东知名网站wordpress春节插件
  • 网站开发的环境网站开发公司福建
  • 基于企业网站的网络营销方法流量套餐汇总网站
  • 网站建设推广行业甘肃省最新消息今天
  • 好看简单易做的网站wordpress 格式
  • 网站生成手机网站家装设计风格
  • 搜狗网站排名软件国内永久免费crm系统z
  • 揭阳网站开发mituad购物网站建设哪家好
  • 有做足球裁判跑动数据的网站吗网站面包屑导航
  • 保定市城乡建设局官方网站下载好的网站模板怎么用
  • 烟台公司网站开发简述网页制作步骤
  • 必须在当地网站备案在域名做网站