C动态内存分配(C与指针实例)
主要初步介绍malloc、free、calloc、realloc的基本。日后会有更详细的内容。
malloc、free分别用于动态内存分配和释放。
malloc会从内存池里提取一块合适的内存(连续的),并返回指向这块内存(起始位置的指针,该指针的类型为void*指针(因为malloc不知道你请求的内存需要存储的数据类型),而且这块内存并没有初始化。
如果操作系统无法提供给malloc足够的内存,malloc就会返回一个NULL指针。因此必须对每个从malloc返回的指针进行检查。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main()
5 {
6 int *pi;
7 int i;
8 pi = malloc( * sizeof( int ));
9
if( pi == NULL )
{
printf( "Out of memory!\n" );
exit();
}
for(i = ; i != ; i++)
pi[i] = i;
for(i = ; i != ; i++)
printf("%d ", pi[i]);
printf("\n");
return ;
24 }
calloc也可以用于内存分配,但是返回指向内存的指针之前会初始化为0。而且calloc和malloc请求内存数量的方式也不一样。
realloc用于修改一个原先已经分配的内存大小。PS:若原来的内存块无法改变大小,realloc将分配另一块正确的小的内存,并把原来的那块内存的内容复制到新的内存块。
free函数的参数为一个先前从malloc、calloc、realloc返回的值。对NULL指针不会产生任何效果。
动态内存分配最常见的错误是忘记检查请求的内存是否分配成功。
《C与指针》里面提供了一个程序可以减少错误的内存分配器。
代码如下:
#include <stdlib.h>
#define malloc //用于防止由于其他代码块直接塞入程序而导致偶尔直接调用malloc
#define MALLOC(num, type) (type *)alloc((num) * sizeof(type))//接受元素的数目和类型,调用alloc函数获得内存,alloc调用malloc并进行检查,确保返回的指针不是NULL
5 extern void *alloc( size_t size );
1 #include <stdio.h>
2 #include "alloc.h"
3 #undef malloc
4
5 void *alloc( size_t size )
6 {
7 void *new_mem;
8 /*
9 * 请求所需的内存,并检查是否分配成功
*/
new_mem = malloc( size );
if( new_mem == NULL )
{
printf("Out of memory!\n" );
exit();
}
return new_mem;
18 }
1 #include <stdio.h>
2 #include "alloc.h"
3
4 int main()
5 {
6 int *new_memory;
7 int i;
8
9 /*
* 获得一个整型数组
*/
new_memory = MALLOC( , int );
for(i = ; i != ; i++)
new_memory[i] = i;
for(i = ; i != ; i++)
printf("%d ", new_memory[i]);
printf("\n");
return ;
}
C动态内存分配(C与指针实例)的更多相关文章
- C++指针和动态内存分配
指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...
- C和C指针小记(十六)-动态内存分配
动态内存分配 1.1 为什么使用动态内存分配 直接声明数组的方式的缺点: 1) 声明数组必须指定长度限制.无法处理超过声明长度的数组. 2) 如果声明更大的常量来弥补第一个缺点,会造成更多的内存浪费. ...
- C和指针 第十一章 动态内存分配
声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...
- 《C和指针》 读书笔记 -- 第11章 动态内存分配
1.C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用内存池. void *malloc(size_t size);//返回指向分配的内存块起始位置的 ...
- C++学习笔记(十一):void*指针、类型转换和动态内存分配
void*指针 void关键字表示“空类型”的概念.但是,这里的“空类型”不表示“任意类型”,而是表示不存在的意思,也就是说C/C++不允许你写语句void a,不存在类型为void的东西. void ...
- 数据结构基础——指针及动态内存分配(malloc)
一.指针 C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数.但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的 ...
- c++ 动态数组,指针与动态内存分配
教学内容: 内存的使用 动态内存分配malloc函数 分配内存时使用sizeof运算符 用指针访问内存 以数组的形式访问内存 一.内存的使用 堆(heap) 在程序执行期间分配内存时,内存区域中的这个 ...
- <c和指针>学习笔记5动态内存分配和预处理器
1 动态内存 比如声明数组得时候,我们需要提前预估数组长度,分配大了浪费,少了就更不好操作了.从而引入动态分配,需要的时候再分配. (1)malloc和free void *malloc(size_t ...
- C++指针与数组、函数、动态内存分配
C++指针 指针是用来存储地址的变量. 对于二维数组来说: a:代表的是首行地址: *a:代表的是首元素地址: **a:首元素: a+1:第二行地址: *a+2:首先*a是首元素地址,在首元素地址上+ ...
随机推荐
- 韩顺平细说Servlet视频系列意外收获之用命令行编译带有包的java类解决方案
命令行编译带有包的java类 在命令行编译这一块,基本上都是新手入门时了解一下,然后就直奔IDE而去.这样固然没错,就怕那些--.然后今天在视频中看到了这种方法,觉得可能会用到,所以就记录下来了,以备 ...
- 【NetOffice Excel】Excel合并单元格【原】
CSharp操作Excel采用开源的原生.NET程序集NetOffice,格式兼容性更好. 在操作Excel的时候有时候需要合并单元格 using ExcelOffice = NetOffice.Ex ...
- js中使用使用原型(prototype)定义方法的好处
经常在前端面试或是和其他同行沟通是,在谈到构造在JS定义构造函数的方法是最好使用原型的方式:将方法定义到构造方法的prototype上,这样的好处是,通过该构造函数生成的实例所拥有的方法都是指向一个函 ...
- Jqplot在joomla组件中的应用
(1)在com_collect组件中采用的是ajax获取json类型的值.[http://www.jqplot.com/tests/data-renderers.php]这上边有实例. (2)在jqp ...
- s3c-u-boot-1.1.6源码分析之一start.s
定位到\s3c-u-boot-1.1.6\cpu\s3c64xx\start.s,打开该文件 /* * armboot - Startup Code for S3C6400/ARM1176 CPU-c ...
- html lang
目前,语言的标签表示法的国际标准是RFC 4646,名称是<Tags for Identifying Languages>.简单说,这个文件规定,一种语言的标签应该按照如下方式排列: la ...
- 1062 Talent and Virtue (25)
/* L (>=60), the lower bound of the qualified grades -- that is, only the ones whose grades of ta ...
- There is a legend about a bird
There is a legend about a bird which sings just once in its life, more sweetly than any other ...
- PostgreSQL+PostGIS的使用 函数清单
一. PostgreSQL与PostGIS的关系 PostgreSQL 是世界上技术最先进的开源数据库,其前身是1977年一个源于Berkeley名为Ingres的非关系型数据库,其项目领导人为Mic ...
- wancms从apache迁移至nginx
首先解决nginx1.2不支持pathinfo问题,见上一篇博文 其次是数据库的用户名变了之后,修改各种配置,wancms的,ucenter的,bbs的 还有一个是wacms的后台站点管理里面的uc配 ...