C中动态分配内存

	//使用动态分配内存时,要包含头文件<stdlib.h>
	//malloc的参数为要分配的内存的字节数
	//其返回所分配内存的第一个字节的地址
	//返回类型是void*,但实际中常常转换为具体类型便于使用
	//如果因某种原因而不能分配将返回NULL指针,所以使用时应验证是否分配成功
	int *pNumber1=(int *)malloc(100*sizeof(int));

	//calloc把内存分配为给定大小的数组,并初始化分配的内存为0
	//calloc需要两个参数,1为数组元素个数,2为数组元素占用的字节数
	//其他和malloc类似
	int *pNumber2=(int *)calloc(100,sizeof(int));

	//释放上面分配的内存
	//	free(pNumber1);
	free(pNumber2);

	//重新分配内存,需要保证之前的没释放
	//参数1是指针,即前面分配返回的地址
	//参数2为要分配的新内存的字节数,其字节数不应超过之前的字节数
	//否则与以前的内存区域大小相同
	//realloc会释放之前分配的内存,然后进行重新分配
	realloc(pNumber1,80*sizeof(int));

使用动态分配内存的基本规则:

1、避免分配大量的小内存块。分配堆上的内存有一些系统开销,所以分配许多小的内存块比分配几个大内存块的系统开销大。

2、仅在需要时分配内存。使用完就立即释放它。

3、总是确保释放已分配内存。在编写分配内存的代码时,就要确定在代码的什么地方释放内存。

4、在释放内存之前,确保不会无意中覆盖堆上分配的内存的地址,否则程序就会出现内存泄露。在循环中分配内存时,要特别小心。

C中动态分配内存,布布扣,bubuko.com

时间: 2024-10-11 13:31:45

C中动态分配内存的相关文章

动态分配内存专题

我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗??既然有人会问这样的问题,那么我在这里好好的讲解一下吧!首先让我们熟悉一下计算机的内存吧!在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数):2)字符常量区:主要是储存一些字符常量,比如:char *p_str="cgat";其中"cgat"就储存在字符常量区里面:3)全局区:在全

在 JNI 编程中避免内存泄漏

JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java Heap 的内存泄漏 Java 对象存储在 JVM 进程空间中的 Java Heap 中,Java Heap 可以在 JVM 运行过程中动态变化.如果 Java 对象越来越多,占据 Java Heap 的空间也越来越大,JVM 会在运行时扩充 Java Heap 的容量.如果 Java Heap 容量

比较C/C++和Delphi中的字符串和字符数组(数组和动态分配内存的情况)

本文所讲解的只是从其中一个方面来看待进行的总结,所以有必要结合<Delphi字符串与字符数组之间的转换(初始化的重要性)>等文章进行更全面的了解,会从更多方面来理解字符串.内存.类型转换 C/C++中的字符串.字符数组.字符指针分配的内存空间 我们知道在C/C++中,我们可以这样理解字符串和字符数组 1)字符串,就是一个以 '\0' 结尾的字符数组 2)字符数组,包括字符串,但是不一定要以 '\0' 结尾,如果不是以'\0' 结尾,那么就不能当做字符串使用 在C/C++中,使用字符串可以通过数

动态分配内存输出文本中的单词的四种做法

题目:有一段文本,将文本中的所有单词,存放到一个字符指针数组中(要求每个单词内存恰好). 第一种做法 char c[] = "     asd afil     kjgl    rip  kjgdr  gds  sdg  gs "; char b[10] = {0}; char *a[10] = {NULL}; int i = 0, j = 0,k = 0;     //i使字符不断后移,j用来标识指针a,k用来标识中间字符数组b; while (1) {//把字符串的'\0' 作为i

Java中堆内存和栈内存详解

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中

c语言中的内存管理

一:内存分为5大区域 栈区     --  存放局部变量 堆区     --  程序运行过程中,动态分配的内存 BSS区    --  未初始化的全局变量和静态变量 数据段    --  已经初始化的全局变量和静态变量 代码段    --  程序编译产生的二进制的数据 内存分配方式: ·1)静态分配,在编译的阶段分配的内存     int a = 10;    静态分配的内存在程序结束后会自动释放 2)动态分配,在程序的运行过程中进行的内存分配 ,动态分配的内存一般存储在堆中,程序结束后内存不会

windows进程中的内存结构(好多API,而且VC最聪明)

在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识.   接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论.下文中的C语言代码如没有特别声明,默认都使用VC编译的release版.   首先,来了解一下 C 语言的变量是如何在内存分部的.C 语言有全局变量(Global).本地变量(Local),静态变量(Static).寄存器变量(Regeister).每种变量都

Java中堆内存与栈内存分配浅析

Java把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用. 堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理.在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数

c++中的内存空间不足和自定义处理内存不足

new操作符动态分配内存时,首先它会调用对象的operator new()函数分配相应大的内存(如果对象类没有重载operator new()函数,则默认调用<new>头文件里的operator new()函数分配内存):接着调用对象的构造函数,初始化这块内存:最后返回指向该内存块的指针. 当分配内存时,如果内存空间不够用,则分配函数会默认抛出bad_allco类型异常,供用户接收并处理.另外,我们还能自己定义如何处理空间不足,用一个函数指明该如何处理内存不足.下面这个例子中,必然会导致内存不