`

堆和栈(三)

    博客分类:
  • C++
阅读更多
4、计算内存容量
用运算符sizeof可以计算出数组的容量(字节数)。如下实例(a)中,sizeof(a)的值是12(注意别忘了空字符'\0'),指针p指向a,但是 sizeof(p)的值却是4,这是因为sizeof(p)得

到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量,C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。如下实例(b)中,不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)
实例(a)计算数组和指针的内存容量
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12字节
cout<< sizeof(p) << endl; // 4字节
实例(b) 数组退化为指针
void Func(char a[100])
{
 cout<< sizeof(a) << endl; // 4字节而不是100字节
}

5、指针参数如何传递内存的(使用指针的指针),思考:动态给指针开辟内存(函数返回值;指针的指针两种方式)

6、杜绝"野指针"
"野指针"不是NULL指针,是指向"垃圾"内存的指针,人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用,“野指针”的成因

主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置

为NULL,要么让它指向合法的内存。例如
char *p = NULL;或char *p = 0;
char *str = (char *) malloc(100);
(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
(3)指针操作超越了变量的作用范围。这种情况让人防不胜防
分享到:
评论

相关推荐

    浅析C语言中堆和栈的区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的...C语言程序经过编译连接后形成编译、连接后形成的二进制映像文件由栈,堆,数据段(由三部分部分组成:只读数据段,已经初始化读写数据段,未初始化数据段即BBS)

    堆和栈的区别

    堆和栈的区别 一、预备知识—程序的内存分配 二、堆和栈的理论知识 三、windows进程中的内存结构

    golang的gc回收针对堆还是栈?变量内存分配在堆还是栈?

    堆和栈的简单说明: 1.栈(操作系统):由操作系统自动分配释放 2.堆(操作系统): 一般由程序员分配释放,例如在c/c++中,在golang,java,python有自动的垃圾回收机制 我们都知道变量占有内存,内存在底层分配上...

    JS的引入及阻塞加载 + 数据类型 + 函数三大特性 (知识小结)

    文章目录一,JS引入及阻塞加载引入js的方式js的加载方式延时加载 和 异步加载 的特点二,JS的 数据类型数字 和 二进制运算符内存管理之 堆 和 栈三,函数:创建,return,作用域函数分为 定义 和 使用 两阶段函数的...

    数据结构 栈和堆类

    严蔚敏《数据结构》第三章 栈与队列 C语言描述

    C语言实现堆排序、用栈实现表达式求值、B+树和红黑树

    以大顶堆为例,首先要根据该数组元素构建一个完全二叉树,之后构造初始堆,从最后一个非终端节点调整到根结点,每次调整都是从父节点、左孩子节点和右孩子节点三者中选择最大者跟父节点进行交换,交换之后可能造成呗...

    每天一个IDA小技巧(三)全局、栈和堆分配的数组和结构体1

    其次,使用可变索引值将带领我们来到数组的开头,因为在计算要访问的数组元素的具体地址时,我们需要用数组的基址加上相应的偏移量,这时基址即呈现出来,并且通过观察与索

    c++如何控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    我们知道,C++将内存划分为三个逻辑区域:堆、栈和静态存储区。既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象。通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制的。但是...

    求职c++后台工作的重点总结

    一、虚函数和纯虚函数的区别;二、堆和栈的区别;三、volitate有什么作用?等等

    iOS 内存管理机制 详细解读

    堆和栈的区别 3.1)申请方式和回收方式 3.2)申请后的系统响应 3.3)申请大小的限制 3.4)申请效率的比较 3.5)分配方式的比较 3.6)分配效率的比较 四. 内存分配的引入 4.1)什么行为会增加App的内存占用? 4.2)...

    java实现内存动态分配

    虽然Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时在堆和栈中都分配内存,在堆中分配的内存实际存放这个被创建的对象的本身,而在栈中分配的内存只是存放...

    JAVA SE 开发手册.CHM

    8、JAVA面向对象之函数、堆和栈、访问修饰符 9、JAVA面向对象关键字 10、JAVA面向对象抽象类abstract 11、JAVA面向对象接口interface 12、JAVA面向对象之内部类、匿名内部类 13、JAVA集合框架之简介 14、JAVA...

    程序员高级(三级)笔试试题

    第一层:通用寄存器堆 第二层:指令与数据缓冲栈 第三层:高速缓冲存储器 第四层:主储存器(DRAM) 第五层:联机外部储存器(硬磁盘机) 第六层:脱机外部储存器(磁带、光盘存储器等) I/O接口的类型 常见...

    Java自学程序员必备+计算机基础+操作系统,组成原理,数据结构+自学必备,内功提升

    20、经常说的堆和栈原来是这么回事.md 21、数据的逻辑结构和物理结构.md 22、数据结构中的绝代双骄(1)数组.md 23、数据结构中的绝代双骄(2)链表.md 24、数据结构中的栈和队列这回懂了.md ……

    深入JVM内核—原理、诊断与优化

    资源名称:深入JVM内核—原理、诊断与优化 教程内容:课程简介:第一周初识JVMJVM分类Java语言规范JVM规范介绍JVM的...第三周常用JVM参数堆的分配参数栈分 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    C++内存管理.doc

    1.1.1.3 堆和栈究竟有什么区别? 1.1.2 控制C++的内存分配 1.1.2.1 重载全局的new和delete操作符 1.1.2.2 为单个的类重载 new[ ]和delete[ ] 1.1.3 常见的内存错误及其对策 1.1.4 指针与数组的对比 1.1.4.1 修改内容...

    c++面试题基础分享.doc

    10.请讲述堆和栈的区别 11.全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的 12.new、delete、malloc、free之间的关系 13. 头文件种的ifndef/define/endif 是干什么用的 14.TCP和UDP...

    JVM内存结构详解

    -Xms -Xmx -Xss的含义三、Java内存中堆和栈的区别——内存分配策略需要先了解区别四、元空间、堆、线程独占部分间的联系——内存角度五、不同JDK版本之间的intern()方法的区别——JDK6 VS JDK6+

    IOS面试题归总

    IOS面试题归总 Object-C有多继承吗?没有的话用什么代替 Object-C有私有方法吗?... 堆和栈的区别? Object-C的内存管理? 为什么很多内置的类,如TableViewController的delegate的属性是assign不是retain?

    .NET中的六个重要概念

    本文首先会通过阐述当你定义一个变量之后系统内部发生的改变开始讲解,然后将关注点转移到存储双雄:堆和栈。之后,我们会探讨一下值类型和引用类型,并对有关于这两种类型的重要基础内容做一个讲解。本文会通过一个...

Global site tag (gtag.js) - Google Analytics