指针与内存分配

指针与数组的内存分配 博客搬家:https://blog.youkuaiyun.com/zheyufuck/article/details/53079058 在实践中经常遇到这样的情况:①二维数组、②指向指针的指针、③指针数组、④数组指针 的使用,经常容易混淆,这里从内存分配的情况进行对比 ①二维数组 char a[2][3]; 二维数组的内存分配情况 ②指向指针的指针 char **p1; 指针的指针在内存分配时... 阅读详情

自己在实际编码中,犯了一些很低级的错误,发现还是基础知识掌握不牢,没有真正地理解。在这里把自己从书上看到的,从网上看到的,罗列了一下,以此警戒自己。

指针的定义
指针是能够存放一个地址的一组存储单元。

内存分配方式有三种:
(1)    从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
(2)    在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3)    从堆上分配,亦称动态内存分配。程序在运行的时候用malloc申请任意多少的内存,程序员自己负责在何时用free释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

指针与内存分配

(1)    在定义指针时,将在栈中开辟一块内存存放指针的地址(栈内的内存由系统分配和释放),指针的地址内存只是存放指针的地址,不存放指针指向的数据。值得注意的是,定义指针时,指针会随机指向一块内存,如int *p;p会指向一块不为空的内存,p只是一个指针,指针指向的内存还没有分配。相当危险,例如执行判断if(!p){ printf("p为空");};这里不会输出"p为空";所以在定义时想让指针p为空,则要int *p = NULL;如果程序大的话,执行的结果出错都不知道在哪里。
(2)    给指针赋值,一种是在堆上分配一块内存(动态分配内存),让指针指向这块内存.第二种是指针指向栈上的一块内存(一般是定义一个非指针变量,让指针指向这个变量)。
(3)    用调试器跟踪下面的代码,发现指针p 被free 以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p 成了“野指针”。如果此时不把p 设置为NULL,会让人误以为p 是个合法的指针。

 

通过以下代码实现:

#include <stdio.h>
#include <malloc.h>

 
int main()
{
   /* 第一种 */
   /* 动态的在堆上分配一块内存(手动分配) */
   int *p = (int*)malloc(sizeof(int));
   *p = 2;
   printf("%d\n", *p);

   /* 释放内存 */
   free(p);
    p= NULL;

   /* 第二种 */
   /* 由系统自动在栈上分配一块内存 */
   int i = 5;
   int *p2 = NULL;
   /*将p2指向栈上i的内存 */
   p2 = &i;
   printf("%d\n", *p2);

   return 0;
}
 

参考:
(1)    C程序设计语言
(2)    高质量C++编程
(3)    http://blog.youkuaiyun.com/bizhu12/article/details/6532235


C、C++、MFC、汇编常用语法文件读写,申请内存空间,MFC EDIT控件输入输出数据,文件对话框示例,YUV与RBG互换公式,动态改变对话框标题,单选/复选控件使用方法,BMP位图显示方法,截取Cstring中某一部分,绘图,使按钮/菜单项失效和生效,char *和CString相互转换,非模态对话框的创建与销毁,移动和复制文件 一、C、C++、MFC、汇编 1.1、 文件读写 1.2、 申请内存空间 1.3、 MFC EDIT控件输入输出数据 1.4、 微机汇编常用指令 1.5、 打开文件对话框示例 1.6、 存储文件对话框示例 1.7、 YUV与RBG互换公式 1.8、 动态改变对话框标题 1.9、 单选/复选控件使用方法 1.10、BMP位图显示方法 1.11、截取Cstring中某一部分_例 1.12、格式化CString数据 1.13、CString数据写入到文件 1.14、读取数据文件到Cstring对象 1.15、绘图 1.16、使按钮/菜单项失效和生效 1.17、在EDIT控件中追加输出文本 1.18、判断MessageBox按下的按钮 1.19、char *和CString相互转换 1.20、隐藏文件 1.21、实现真彩色的按钮 1.22、非模态对话框的创建与销毁 1.23、移动和复制文件 立即下载

相关推荐

指针内存分配

1、一维指针内存分配。//作数组使用时 int *p = NULL; //保存int类型数据 int n = 7; //数组长度 p = (int *)malloc(sizeof(int)*n); int i; for(i=0; i<n; i++) p[i] = 0; free(p); //释放2、指针数组内存分配int n = 6; int *p[n]; //保存int指针类型数据的数组

ZD的博客 4361

聚类技术:发展历史、主要分类与重要论文解析

在数据挖掘和机器学习的广袤领域中,聚类作为一种强大的无监督学习技术,一直扮演着至关重要的角色。它能够帮助我们从海量的数据中发现隐藏的模式和结构,将相似的数据对象归为一类,从而为进一步的分析和决策提供有价值的信息。

qq_48131648的博客 2631

C语言指针 动态内存分配

C语言指针(连载ing) 引言:本文章根据比特科技张鹏伟老师的C语言课程的指针进阶内容所做笔记 指针进阶(一) 1.一个数组的数组名就是它的首元素地址 int arr[5] = {0}; //声明一个有5个整型元素的数组 printf("%p\n", arr); //打印这个数组首元素的地址 输出一个16进制数代表地址 printf("%p\n", &arr[0]); //用一种更加直接的方式去打印首元素的地址,别忘了取地址符 可以发现两个地址是相同

m0_51513374的博客 2650

关于Selenium3在MicrosoftEdge浏览器中出现的问题

前言 最近在做web自动化测试,所用环境是java+selenium3.141.59+MicrosoftEdge(Chromium)浏览器。 在调试的过程中,出现了很多问题。比如selenium3在Edge浏览器中远程调用中,不支持addArguments方法等 问题 1.Edge浏览器弹窗问题 在测试过程中,会出现弹出窗提示 ...

zhucheng1994的博客 2199

【动态规划】背包问题(详细总结,很全)

暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(Dynamic Planning) 里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。二维dp数组01背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历一维dp数组01背包,只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。求组合数:外层遍历物品,内层遍历背包。

m0_51370744的博客 4万+

C语言指针操作(十)动态内存分配与指向它的指针变量

全局变量是分配在内存中的静态存储区的,非静态的局部变量(包括形参)是分配在内存中的动态存储区的,这个存储区是一个称为栈 ( stack ) 的区域。除此以外,C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为堆 ( heap ) 区。可以根据需要,向系统申请所需大小的空间。

伯努利 3646

WPF 上位机可视化天花板:HandyControl 搭建 SCADA 系统

HandyControl 凭借「丰富的工业级控件、灵活的主题定制、优异的性能」,成为 WPF 开发 SCADA 系统的首选 UI 库。本文搭建的 SCADA 系统涵盖实时监控、设备控制、报警管理、趋势分析四大核心功能,通过 HandyControl 实现了工业级可视化效果,开发效率提升 60% 以上。控件开箱即用:无需自定义仪表盘、趋势图、指示灯等 SCADA 核心控件;可视化效果专业:工业风主题、动态颜色切换、清晰的状态呈现,契合工业场景需求;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1126

指针管理运行阶段的内存分配

编程时可以将指针初始化为一个变量的地址;而变量是在编译时分配的有名称的内存,所以指针只是为可以通过名称直接访问的内存提供了一个别名。即也可以通过指针完成内存的访问。但指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值,此时只能通过指针访问内存。在C语言中可以使用malloc()库函数来分配内存,在C++中也可以继续这么做,但是使用new运算符是更好的做法。需要在两个地方指定数据类型,用来指定需要什么样的内存和用来声明合适的指针。

Ting_lover的博客 697

C++ Qt6 qml CMakeLists.txt如何添加qrc文件

本文介绍了在Qt6项目中如何通过CMake管理QML图片资源。相比Qt5的qmake,CMake需要手动创建qrc文件并配置CMakeLists.txt。关键步骤包括:1)创建resources.qrc文件并添加图片资源;2)在CMakeLists.txt中设置CMAKE_AUTORCC为ON开启自动资源处理;3)使用qt_add_resources将qrc文件绑定到项目。配置完成后,可通过"qrc:alias"方式引用资源图片,解决了相对路径管理复杂的问题。

琅嬛福地 1453

S7-1500——(一)西门子PLC编程算法及程序设计1、拆解基本算法(一)

顺序队列也是一种操作受限的线性表,在一端添加数据,另一端取出数据,符合先进先出的特性工作过程:需要两个指针来指向存取元素的位置(头指针,尾指针)如下图头指针指向队列里边第一个元素位置(即下次出队元素所在的位置)尾指针是指向队列内最后一个元素的下一个位置(即下次要入队的元素要存放的位置)空队状态:最初始状态,队列没有任何元素,头指针和尾指针都指向队头,(由于没有任何元素,不能做出队操作,可进行入队操作)入队操作出队操作满队:一直入队,最终元素装满队列;满队后,虽然队列前面还有空间,但由于。

大小曲奇的博客 1609

C语言,指针与内存分配

指针变量与内存分配 1. char * str1; //str1 只是一个指针,指针指向的空间还没有分配,所以此时用strcpy向str1所指向的内存 中拷贝内容将出错。利用malloc动态分配指向的内存(在堆中): str1=(char *)malloc(10) or str1=(char *)malloc(sizeof(char) *num)//分配num个char 所占有的字节(一

xiaotong0202的专栏 5061

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

ChenJin_2的博客 276

指针变量与内存分配

指针变量与内存分配 1. char * str1; //str1 只是一个指针,指针指向的空间还没有分配,所以此时用strcpy向str1所指向的内存 中拷贝内容将出错。利用malloc动态分配指向的内存(在堆中): str1=(char *)malloc(10) or str1=(char *)malloc(sizeof(char) *num)//分配num个char 所占有的字节(一

why is this 1916

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

内存分配与野指针

内存分配与野指针原文地址:内存分配与野指针

wwwcomcn123的专栏 240

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Go语言指针与内存分配深度解析:从指针本质到 new、make 的底层实现

本文深入解析Go语言指针与内存分配机制。首先介绍了指针的本质是存储内存地址的变量,通过&取地址、*取值操作可间接访问数据。其次讲解了指针在函数参数传递中的应用,实现数据修改。然后区分了栈内存(自动管理)和堆内存(GC管理)的分配方式。重点剖析了new()函数为基本类型分配堆内存并返回指针,以及make()函数专为slice、map、channel等引用类型初始化内存结构的区别。通过多个代码示例展示了指针声明、函数传参、内存分配等核心概念的实际应用,帮助读者深入理解Go语言的内存管理机制。

莫踌躇 1169

指针操作_1,指针基础Pointer Fundamentals与内存分配storage allocation

I 指针基础 a pointer is simply a variable that stores the address where a piece of data resides in memory rather than storing the data itself. 指针是存储存放在内存中的数据的地址的变量,而不是存放数据本身。 That is, pointers contain

Unist_new_life的专栏 534

指针与内存分配详解

指针与内存, 指针数组,常量指针类笔记   1. char * str1; //str1 只是一个指针,指针指向的空间还没有分配,所以此时用strcpy向str1所指向的内存 中拷贝内容将出错。利用malloc动态分配指向的内存(在堆中): str1=(char *)malloc(10) or str1=(char *)malloc(sizeof(char) * num)//分配num个

磊啊磊 2228

C++指针内存分配与释放

int* ,char* 等只要不是new的,不用释放,系统会自动把他们占的内存释放掉,只有new的才会手动的去delete。p在栈上,而且p的值也是。:调用类的析构函数和释放内存(先调用对象的析构函数,然后利用全局的operator delete(一般通过std::free实现)函数释放内存,并不会将指针自动置空。这时候,p这个变量是在栈上的。但是p的值是一个地址,这个地址是。那么,这个地址会一直被占用着,不能被其他的对象所使用。分配的是一块内存区域,用指针访问,可以在里面。:分配内存、调用类的构造函数。

Rainbow 1241

C指針與內存分配完全詳解

C語言中指針和內存的分配一直是一個很讓人頭疼的問題,也相信不少人在這裡掉過坑,然而指針和內存分配又是C語言逃不過的一課,希望本詳解能幫助大家理解指針和內存分配,儘快掌握C語言。

m0_57845566的博客 814

C++——指针与内存分配

指针与内存分配 Thanks for 注意栈空间与堆空间都是有限的,因而可能出现空间过大的状态,将大的数组放在全局数据。 1.静态数据区 内存连续分配,数据的地址与分配顺序有关   2.栈空间 栈是一种先进后出的数据结构 函数内定义的局部变量及函数参数都在栈空间分配. 栈空间中内存连续分配, 数据的地址顺序与数据分配的先后顺序相反. 每个线程(程序)的栈空间独立且大小有限,栈空间分配...

weixin_45683677的博客 1812

JVM内存分配的指针碰撞与空闲列表

指针碰撞和空闲列表是 JVM 内存分配的 “两种基础范式”,其设计本质是 “速度” 与 “灵活性” 的权衡 :指针碰撞追求 “极致的分配速度”,但依赖规整的内存,适合年轻代等频繁分配对象的场景;空闲列表追求 “碎片内存的灵活利用”,但牺牲了分配速度,适合老年代等存在内存碎片的场景。理解两种策略的差异,不仅能掌握 JVM 内存分配的底层逻辑,还能帮助分析 GC 性能问题(如 CMS 老年代因空闲列表查找慢导致的分配延迟,或 G1 因内存规整带来的分配高效性)。

埃泽漫笔 887

Go语言中的值类型与指针类型:理解内存分配与访问

Go语言中的值类型与指针类型:理解内存分配与访问

一起coding,一起嗨。 600

指针详细基础知识(包括内存分配,动态数组,常量指针,字符串与指针,指针的指针)

今天起重新学习下C++的基础知识,先整理关于指针的知识。 指针基础用法 int* p;//p是一个指针,类型是int*,要指向int类型 int* p;//强调p是一种int*类型指针——指向int数据类型 int *p;//强调*p是int类型的值 //这两种对于编译器没有区别,看个人习惯使用 int* p = (int *)40000;//强制类型转换 //此时p的内容就是40000,也代表着p指向了内存地址为40000的数据 *p = 5000;//将5000写入地址40000之后的4个字节 int

hzxxdyzh的博客 210

数组变量与指针变量内存分配区别

上面代码输出为两个字符串的首地址值,也就是数组变量名的值,数组变量名的值等于字符串的首地址值。输出结果两者地址值相差4,这是因为局部变量存放在栈空间里的地址是连续的,且指针变量的大小占4个字节。输出结果两个值是一样的,这就是两种定义的区别,数组定义是直接给数组分配一个内存空间,而指针定义则是将指针变量指向某一块地址。

m0_62672176的博客 248
下一篇: 搭建arm-linux-gcc交叉编译环境
noted2011
博客等级 码龄15年 7粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值