VS调试、debug和release、栈区底层简单介绍、const 修饰指针变量介绍

本文主要是介绍VS调试、debug和release、栈区底层简单介绍、const 修饰指针变量介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、调试
  • 二、debug和release
  • 三、调试需要多用,多熟悉
  • 四、栈区底层简单介绍
  • 五、优秀的代码:
    • 常见的coding技巧:
  • 六、const 修饰指针变量
    • 1. const 出现在 * 左边
    • 2. const 出现在 * 右边
  • 七、strcpy函数的仿写
    • 1.版本1
    • 2. 版本2
    • 3. 版本3
    • 4. 版本4
  • 总结


前言

VS调试、debug,release、栈区底层简单介绍,好的代码,以及const修饰指针变量以及strcpy函数的仿写

一、调试

调试的快捷键

  1. F5 启动调试,经常用来直接跳转到断点。
  2. F9 创建和取消断点。
  3. F10 一次执行一个过程,比如一个语句,一次函数的调用
  4. F11 一次执行一句话,会进入函数内部执行语句

二、debug和release

  • debug 通常是指调试版本。
  • release 通常是发布版本,无法调试。

三、调试需要多用,多熟悉

  • 调试很重要
  • 据说,初学者80%写程序,20%调试(修bug),程序员20%写程序,80%调试.

四、栈区底层简单介绍

  • 先看一个例子
  • 这是在VS2019环境下的代码
  • 此代码的结果是死循环,重复打印“hehe”。
#include <stdio.h>int main()
{int i = 0;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };for (i = 1; i <= 12; i++){arr[i] = 0;printf("hehe\n");}// i 与 arr 都是局部数据,都会放到栈区// 栈区的使用习惯是先高地址,再低地址// 所以,i 是 高地址, arr 是低地址// 但是 arr 数组的下标是由低地址到高地址// 所以给一定情况的越界,会导致 arr 和 i 的是同一个地址// 所以 i 会不断地重置为0 ,会陷入死循环。return 0;
}
  • 内存分为 栈区,堆区,静态区
    1. 栈区内存的使用习惯是,先使用高地址空间,再使用低地址处的空间。
    1. 数组随着下标的增长地址是由低到高变化的。
    1. 如果i 和 arr之间由适当的空间,利用数组的越界操作就可能会覆盖到i,就可能会导致死循环出现的。

在这里插入图片描述

五、优秀的代码:

  1. 代码运行正常
  2. bug少
  3. 效率高
  4. 可读性高
  5. 可维护性高
  6. 注释清晰
  7. 文档齐全

常见的coding技巧:

  1. 使用assert
  2. 尽量使用const
  3. 养成良好的编码风格
  4. 添加必要的注释
  5. 避免编码的陷阱

六、const 修饰指针变量

1. const 出现在 * 左边

 int main(){int a = 0;int n = 0;const int* p = &a;//*p = 0; // errp = &n; // rightreutrn 0;
}
  • 如上代码
  • const 出现在 * 左边,表示指针变量p所指向的对象能通过变量p被修改。
  • 但是,指针变量p可以重新取地址,不可以被修改。

2. const 出现在 * 右边

 int main(){int a = 0;int n = 0;int* const p = &a;*p = 0; // right//p = &n; // errreutrn 0;
}
  • 如上代码
  • const 出现在 * 右边,表示指针变量p所指向的对象可以通过变量p被修改。
  • 但是,指针变量p可以重新取地址,可以被修改。

七、strcpy函数的仿写

  • strcpy库函数是会把字符串的**\0字符**也拷贝上的。

1.版本1

#include <stdio.h>
//  strcpy函数的仿写
void my_strcpy(char* dect, char* ret)
{while (*ret != '\0')// ret中若找到\0则跳出循环,此时*ret已经时\0,再次赋值就可以将\0也拷贝到dect中{*dect = *ret;dect++;ret++;}*dect = *ret;
}int main()
{char arr1[20] = "XXXXXXXXXXXXXX";char arr2[] =   "hello bit";my_strcpy(arr1, arr2);printf("%s", arr1);return 0;
}

2. 版本2

#include <stdio.h>
//  strcpy函数的仿写
void my_strcpy(char* dect, char* ret)
{while (*ret != '\0'){*dect++ = *ret++;}*dect = *ret;
}int main()
{char arr1[20] = "XXXXXXXXXXXXXX";char arr2[] = "hello bit";my_strcpy(arr1, arr2);printf("%s", arr1);return 0;
}

3. 版本3

#include <stdio.h>
//  strcpy函数的仿写
void my_strcpy(char* dect, char* ret)
{while (*dect++ = *ret++){;}
}int main()
{char arr1[20] = "XXXXXXXXXXXXXX";char arr2[] = "hello bit";my_strcpy(arr1, arr2);printf("%s", arr1);return 0;
}

4. 版本4

  • 考虑到如果用户传过来的不是指针
  • 如果传入数据写反了等情况
#include <stdio.h>
#include <assert.h>
//  strcpy函数的仿写
void my_strcpy(char* dect, const char* ret)
{assert(dect != NULL);assert(ret != NULL);while (*dect++ = *ret++)// ret中若找到\0则跳出循环,此时*ret已经时\0,再次赋值就可以将\0也拷贝到dect中{;}
}int main()
{char arr1[20] = "XXXXXXXXXXXXXX";char arr2[] = "hello bit";char p = NULL;//my_strcpy(arr1, p); // 错误示例//my_strcpy(arr2, arr1); // 会报错my_strcpy(arr1, arr2); printf("%s", arr1);return 0;
}

总结

VS调试、debug,release、栈区底层简单介绍,好的代码,以及const修饰指针变量以及strcpy函数的仿写

这篇关于VS调试、debug和release、栈区底层简单介绍、const 修饰指针变量介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933568

相关文章

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语