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++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的