首页 > 编程语言 >c++学习8 动态空间申请

c++学习8 动态空间申请

时间:2023-02-16 19:46:28浏览次数:44  
标签:int 申请 c++ char 字符串 空间 new 动态 结构

一 动态分配内存的概述

在数组一幕中,介绍过数组的长度是事先预定好的,在整个程序中固定不变。但是在实际的编程过程中,往往会发生这种情况:我们并不清楚到底需要多少数目的空间,而且无法事先预定,所以对了应对这种情况,c++准备了一些关键字,可以需要按动态去分配内存空间,也可以把不再需要的空间回收利用。

 

二 静态分配和动态分配

静态分配:

1.在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式,int a[10];

2.必须事先知道所需空间的大小;

3.分配在栈区或者全局变量区,一般以数组的形式存在。

动态分配:

1.在程序运行过程中,根据需要大小自由分配所需空间;

2.按需分配;

3.分配在堆区,一般使用特定的关键字进行分配。

 

三 new和delete

new负责申请空间,而delete负责释放空间。

example:

int *p=NULL;

p=new int ;//从堆区里申请int类型大小的空间。

*p=100;

cout<<*p<<endl;//输出结果为100。

//一定要记得释放空间,不然的话只要你进程不结束,这个堆栈空间就会一直存在。

delete p;//new和delete一定要成对的出现。

//new申请空间的同时,可以同时初始化空间的内容。

int *p1=NULL;

p1 = new int (100);

cout<<*p1<<endl;//输出结果为100。

delete p1;//不要忘记释放空间哦。

 

new与delete操作数组空间,new在申请的时候要加上“[ ]”,而delete在释放空间的时候也需要带上“[ ]”。

example:

int *arr=NULL;//做一个指针去指向申请的空间。

arr=new int [5]{10,20,30,40,50};//申请int类型的数组,包含了5个元素,用大括号同时初始化。

delete [] arr;//释放空间,但是是数组 [ ] 。

 

四 字符串处理数组

字符串操作函数:#include<string.h>

 

测量字符串长度的strlen函数:

size_t strlen(const char *s);//s指的是需要测量的字符串长度的首地址。

example:

#include<string.h>

char str1[128]="hello";

strlen(str1);//结果为5。

char str2[128]="he\0llo";

strlen(str2);//结果为2。

 

字符串拷贝函数strcpy函数

将一个字符串数组拷贝到另一个字符串数组里面。

char *strcpy(char *dest,char *src);

char *strcpy(char *dest,char *src,size_t n);

//dest:目的空间地址。src:原字符串数组空间首地址。

 

 

 目标拷贝空间一定要保证有足够大的空间,不然会造成内存污染。

不仅是拷贝需要内存,而且字符串尾部追加也可以用这个函数,前提是保证目标对象空间足够。

 

 

 

字符串比较函数strcmp:

#include<string.h>

int strcmp(const char *str1,const char *str2);//逐个比较字符串内字符的大小。

int strcmp(const char *str1,const char *str2,size_t n);//逐个比较字符串前n个字符的大小。

返回值:

>0:str1大于str2字符串。

<0:str1小于str2字符串。

==0:str1字符串大小等于str2字符串。

 

 

 

 

五 结构体

结构体概述:将不同类型的数据组合为一个有机的整体。

c++提供struck关键字,可以将不同类型的数据封装在一起,这个被封装的整体就是结构体。

 

 

 

结构体类型的定义:

struck 结构体类型名

{

  数据列表(数据类型+单个结构体内数据数目)

}(结构体成员名称);

example:

 

 

 上面的lucy和bob就是结构体的成员名,而该结构体类型为“Student”。

 

三种定义结构体类型的方法

1.先定义结构体类型,再定义结构体变量。

 

 

 2.定义结构体类型的同时,定义结构体变量。

 

 

 

3.不定义结构体类型,定义结构体变量(比较浪费,只能一次性使用)

 

 

 

 

结构体变量的初始化:

结构体在初始化的时候必须严格遵守数据成员的顺序和对应的数据类型。

 

 

结构体在使用后如果不及时赋值或者初始化,那么输出结果为乱码。

 

 

 

 

 

 

使用memset清空整个结构体变量

void* __cdecl memset(
  _Out_writes_bytes_all_(_Size)   void* _Dst,
  _In_                  int _Val,
  _In_               size_t _Size
          );

将地址从_Dst开始,长度为Size_t的所有字节赋值为Val。

 

Tips:

1.new申请空间后如果没有delete来释放空间的话,就会造成空间泄露,别的程序想释放也释放不了;

2.结构体在被定义时系统并不会为它开辟空间,而一旦我们使用了结构体系统就会立刻开辟空间;

3.结构体中的变量具有归属性,访问其中特定变量成员的方法是需要通过“结构体成员.数据类型名称”。

标签:int,申请,c++,char,字符串,空间,new,动态,结构
From: https://www.cnblogs.com/wangbohan/p/17127608.html

相关文章

  • 【开源需求】C++多线程消息分发架构
    项目【gi_messager】开源项目:https://girakoo.com/联系方式:[email protected]需求简述在多线程环境中,为每个线程提供独立的消息队列MessageLoop。注:主线程默认自动......
  • 谈谈muduo库的销毁连接对象——C++程序内存管理和线程安全的极致体现
    #前言网络编程的连接断开一向比连接建立复杂的多,这一点在陈硕写的muduo库中体现的淋漓尽致,同时也充分体现了C++程序在对象生命周期管理上的复杂性,稍有不慎,满盘皆输。为......
  • C++ (伪)随机数生成
    #include<iostream>#include<random>namespacerandom{//从系统获取随机数作为种子std::random_devicerd;//创建种子序列std::seed_seqrr{r......
  • 关于c++内存优化的方法
    1.使用智能指针shared_ptr<>或者unique_ptr<>此种方法new出来的对象的内存会在超出作用域后自动释放2.使用clear清除列表或者swap清空对象 或者将指针赋值为NULL3.r......
  • Specifications动态查询
    【前言说明】针对CRUD种的查询,因为我们的查询总是具有各种各样的筛选条件为了我们的程序能够更加适应筛选条件的变化,SpringDataJpa提供了Specifications这种解决方案 ......
  • C++梳理
    1、基础篇1、C++中的四种智能指针为什么要使⽤智能指针:智能指针其作⽤是管理⼀个指针,避免程序员申请的空间在函数结束时忘记释放,造成内存泄漏这种情况的发⽣。使⽤智能......
  • JPA使用Specification构建动态查询
    封装Specification查询条件,在SpringDataJPA2.0以前使用Specifications这个辅助类来操作where、not、and和or连接,在2.0版本以后这个类会被剔除,可以直接使用Specificat......
  • vue3实现动态路由配置
    思路:1、登录成功后,返回动态的路由信息,存储在本地localStorage中。2、router.js中在路由守卫钩子函数中使用router.addRoute()进行动态路由添加。具体代码: login.vue......
  • C++ 浮点数比较代码
    #include<algorithm>#include<cmath>#include<iostream>//如果a和b之间的差异在a和b中较大者的epsilon百分比以内,则返回trueboolapproximatelyEqualR......
  • 从实现到原理,聊聊Java中的SPI动态扩展
    原创:微信公众号码农参上,欢迎分享,转载请保留出处。八股文背多了,相信大家都听说过一个词,SPI扩展。有的面试官就很喜欢问这个问题,SpringBoot的自动装配是如何实现的?基本......