静态内存与动态内存 malloc函数动态分配内存

动态内存

  • 🌸栈和堆
  • 🌸静态内存的缺陷
  • 🌸malloc函数的使用
  • 🌸易混淆:静态内存与静态变量
  • 🌸malloc动态分配内存

🌸栈和堆

栈和堆都是计算机中常用的内存数据结构,两者各自的特点和优缺点:
数据结构 :栈是一种线性结构,堆是一种树形结构。
内存分配方式:栈是由编译器在需要时分配的、不需要时自动清除的变量存储区。栈的内存分配和释放由系统自动管理,不需要程序员手动控制。堆是由程序员手动分配和释放的内存块,通常使用malloc()或new操作符来动态分配内存。
存储内容:栈中存储的一般是函数参数、函数调用和局部变量等。堆主要用于存储对象实例和数组。
栈的优点:分配和释放内存的操作非常高效。
栈的缺点:栈的大小有限,不能动态扩展。
堆的优点:可以动态扩展,分配的内存空间较大,存储自由。
堆的缺点:需要手动进行内存管理,如果没有及时释放分配的内存,会导致内存泄漏或内存溢出的问题。

🌸静态内存的缺陷

以传统数组为例,来简述一下静态内存的缺陷:
①在定义时,数组的大小必须是事先知道的。比如int arr[100];,并且在一般情况下,为了解决实际问题,保证数组的大小足够用,可以存储足够的变量,我们一般都会将数组的长度定义的足够长。在这样的情况下,一般就存在内存浪费的问题。
②数组存储在栈区。在程序运行期间,一个函数中定义的数组只能在该函数运行期间被其他函数调用。函数运行结束后由系统自动释放内存空间。而动态内存空间就不存在这样的问题,动态内存空间是由程序员手动分配的内存块。只要程序员不释放该内存空间,就算函数运行结束,该内存空间也不会被释放。只有当程序运行结束,这时系统为该程序分配的所有内存空间都会被释放。

🌸malloc函数的使用

malloc是一个系统函数,它是memory allocate的缩写。其中memory是“内存”的意思,allocate是“分配”的意思。所以顾名思义malloc函数的功能就是“分配内存”
malloc函数的原型:

void* malloc (size_t size);

头文件:

#include <stdlib.h>

size_t是一种整型类型,用来记录一个对象或数据类型的大小。通常通过使用sizeof操作符来获取变量或数据类型的大小,并将其赋值给size_t类型的变量。size_t类型可以用来对其他size_t类型的变量初始化,并且可以将其转换为int类型的值。类似地,ptrdiff_t是另一种整型类型,用于计算指针之间的元素个数差异

函数功能:

该函数的功能是在内存的动态存储空间即中分配一个长度为size的连续空间
函数的返回值: 一个指向所分配内存空间 起始地址指针,类型为**void ***型。

对于void*:
void *是一种特殊的指针类型,它可以指向任意类型的数据。
与其他指针类型不同,我们无需进行强制类型转换就可以将任何类型的指针赋值给void *

int *p1;
void *p2;
p2=p1;//将p2赋值给p1

这不意味无类型指针可以赋值给其他类型的指针。
一般情况下,我们都要进行强制转换。

int *p1;
void *p2;
p1=(int*)p2;

malloc函数的返回值是一个地址,这个地址就是动态分配的内存空间起始地址。如果此函数未能成功地执行,如内存空间不足,则返回空指针NULL

🌸易混淆:静态内存与静态变量

静态变量:一般是由static关键字修饰。静态变量与全局变量一样都是在静态存储区中存储的。
静态内存:静态内存是在栈中分配的,比如局部变量。

🌸malloc动态分配内存

如何区分是一个内存是静态内存还是动态内存呢?
我们一般用malloc函数进行区分。动态分配内存都有一个标志,即使用malloc函数进行区分。
如何使用malloc函数呢?

int *p=(int*)malloc(4);

它的意思是:
请求操作系统分配4个字节的内存空间,并返回动态内存的第一个字节的地址。使用强制转换(int*),将malloc函数的返回值强制转换成int *型。将此int 型指针赋值给p

这里需要注意的是:
指针变量p是在静态内存存储的。 指针变量p是用传统的方式定义的,所以是静态分配的内存空间。
而指针变量p所指向内存空间动态分配的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/78739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring面试】三、Bean的配置、线程安全、自动装配

文章目录 Q1、什么是Spring Bean&#xff1f;和对象有什么区别Q2、配置Bean有哪几种方式&#xff1f;Q3、Spring支持的Bean有哪几种作用域&#xff1f;Q4、单例Bean的优势是什么&#xff1f;Q5、Spring的Bean是线程安全的吗&#xff1f;Q6、Spring如何处理线程并发问题&#xf…

【已解决】您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。

您所使用的密钥ak有问题&#xff0c;不支持jsapi服务&#xff0c;可以访问该网址了解如何获取有效密钥。详情查看&#xff1a;http://lbsyun.baidu.com/apiconsole/key#。 问题 百度密钥过期 思路 注册成为开发者 如果还没注册百度地图api账号的&#xff0c;点击以后就进入…

【深度学习】 Python 和 NumPy 系列教程(廿二):Matplotlib详解:2、3d绘图类型(8)3D饼图(3D Pie Chart)

一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名&#xff0c;并且具有强大的功能和广泛的应用领域。Python具有丰富的标准库和第三方库&#xff0c;可以用于开发各种类型的应用程序&#xff0c;包括Web开发、数据分…

WebRTC 源码 编译 iOS端

1. 获取依赖工具 首先&#xff0c;确保你已经安装了以下工具&#xff1a; GitDepot ToolsXcode&#xff08;确保已安装命令行工具&#xff09; 2. 下载 depot_tools 使用 git 克隆 depot_tools 并将其添加到你的 PATH 中&#xff1a; /path/to/depot_tools 替换为自己的路径…

unity C#客户端与服务器程序

客户端和服务器公共的脚本 OSC.cs // This is version 1.01(2015.05.27) // Tested in Unity 4 // Most of the code is based on a library for the Make Controller Kit1/* using UnityEngine; using System; using System.Collections; using System.Threading; using Syst…

Furion api npm web vue混合开发

Furion api npm web vue混合开发 Furion-api项目获取swagger.json文件复制json制作ts包删除非.ts文件上传到npm获取npm包引用 Furion-api项目获取swagger.json文件 使用所有接口合并的配置文件 复制json制作ts包 https://editor.swagger.io 得到 typescript-axios-clien…

【实用工具】Centos 安装ARL灯塔

文章目录 docker 安装安装docker-compose配置镜像加速器ARL安装和启动 docker 安装 yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm yum install docker-ce (若出现无法找到包可能是镜像源问题) 更…

怎么科学管理固定资产呢

在当今的商业环境中&#xff0c;固定资产的管理是企业成功的关键因素之一。然而&#xff0c;传统的固定资产管理方法往往过于繁琐&#xff0c;缺乏创新&#xff0c;导致资源的浪费和效率的低下。因此&#xff0c;我们需要一种新的、更加科学的方法来管理我们的固定资产。本文将…

C++多线程的用法(包含线程池小项目)

一些小tips: 编译命令如下&#xff1a; g 7.thread_pool.cpp -lpthread 查看运行时间&#xff1a; time ./a.out 获得本进程的进程id&#xff1a; this_thread::get_id() 需要引入的库函数有&#xff1a; #include<thread> // 引入线程库 #include<mutex> //…

Ui自动化测试上传文件方法都在这里了 ~

前言 实施UI自动化测试的时候&#xff0c;经常会遇见上传文件的操作&#xff0c;那么对于上传文件你知道几种方法呢&#xff1f;今天我们就总结一下几种常用的上传文件的方法&#xff0c;并分析一下每个方法的优点和缺点以及哪种方法效率&#xff0c;稳定性更高 被测HTML代码…

结构型模式-享元模式

主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c;它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对象&#xff0c;如果未找到匹配的对象&#xff0c;则创建新对象。我们…

java并发编程 SynchronousQueue详解

文章目录 1 SynchronousQueue是什么2 核心属性详解3 核心方法详解3.1 transfer(E e, boolean timed, long nanos)3.1.1 TransferStack实现3.1.2 TransferQueue实现 3.2 外部方法3.2.1 put(E e)3.2.2 offer(E e)3.2.3 take()3.2.4 poll() 4 总结 java 并发编程系列文章目录 1 S…

shell脚本之sed命令

shell脚本之sed命令 sed 命令的一些常用选项sed 命令的一些常用命令具体例子 sed 在 Shell 脚本中非常常用&#xff0c;可以用于文本替换、插入、删除等操作。 以下是 sed 命令的基本语法&#xff1a; sed [选项] 命令 [文件...]其中&#xff0c;选项是可选的&#xff0c;可以…

关于CMake多级目录/多个子目录/子目录文件调用另外子目录文件接口及清除CMake生成的中间文件的注意事项

1&#xff09;如果子目录代码文件相对独立&#xff0c;也就是没有引用其他子目录的文件&#xff0c;可以单独编译成库文件 上层CMakeLists.txt通过link_libraries()来添加这个库文件 2&#xff09;如果子目录代码引用了其他子目录的文件&#xff0c;建议在上一层编译(前提也是…

睿趣科技:抖音开店前期需要准备什么

抖音作为全球最受欢迎的短视频平台之一&#xff0c;已经成为了许多年轻人的创业和赚钱的机会。如果你计划在抖音上开店&#xff0c;那么在正式开业之前&#xff0c;有一些重要的准备工作是必不可少的。下面就是抖音开店前期需要准备的关键步骤和注意事项。 确定你的目标和产品&…

Matlab图像处理-三原色

三原色 根据详细的实验结果&#xff0c;人眼中负责颜色感知的细胞中约有65%对红光敏感&#xff0c;33%对绿光敏感&#xff0c;只有2%对蓝光敏感。正是人眼的这些吸收特性决定了所看到的彩色是一般所谓的原色红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;和蓝&…

动态渲染 echarts 饼图(vue 2 + axios + Springboot)

目录 前言1. 项目搭建1.1. 前端1.2. 后端 2. 后端数据渲染前端2.1 补充1&#xff1a;在 vue 中使用 axios2.2. 补充2&#xff1a;Springboot 处理跨域问题2.3. 修改前端代码2.3.1 修改饼图样式2.3.2 调用后台数据渲染饼图2.3.3 改造成内外两个圈 前言 因为上文中提到的需求就是…

内网隧道代理技术(二十五)之 ICMP隧道反弹SHELL

ICMP隧道反弹SHELL ICMP隧道原理 由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性。把数据隐藏在ICMP数据包包头的data字段中,建立隐蔽通道,可以实现绕过防火墙和入侵检测系统的阻拦。 ICMP隧道有以下的优点: ICMP…

腾讯云4核8G服务器选CVM还是轻量比较好?价格对比

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例&#xff0c;轻量4核8G12M服务器446元一年&#xff0c;CVM S5云服务器935元一年&#xff0c;相对于云服务器CVM&#xff0c;轻量应用服务器性价比更高&#xff0c;轻量服务器CPU和CVM有区别吗&#xff1f;性…

博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)

博客系统 (三&#xff09; 博客系统博客主页前端后端个人博客前端后端显示个人文章删除文章 修改文章前端后端提取文章修改文章 显示正文内容前端后端文章阅读量功能 添加文章前端后端 如何使用Redis项目地点&#xff1a; 博客系统 博客系统是干什么的&#xff1f; CSDN就是一…