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是首元素地址,在首元素地址上+ ...
随机推荐
- 6款好用的Python IDE
“工欲善其事,必先利其器”,如果说编程是程序员的手艺,那么IDE就是程序员吃饭的家伙了.一个优秀的IDE,最重要的就是在普通文本编辑之外,提供针对特定语言的各种快捷编辑功能,让程序员尽可能快捷.舒适. ...
- JQuery 预热
这是第一次在博客园写随笔,之所以有这样的冲动是因为每次看到很多园友不断的发表文章,记录下自己的点点滴滴,内心就在不断的忏悔,我很敬佩这种人,不管他们表达的东西是初级还是精辟,我认为只要去坚持写了就是一 ...
- GDI+绘制文本
这是在论坛中有人提出的一个问题,原贴见:Graphics DrawString参数无效.这里给出方法,读者可以自行修改以适应自己的项目需求. 先上代码: if (!Page.IsPostBack) { ...
- Setfocus - IE 需要使用setTimeout
setTimeout(function () { $('#controlid').focus(); }, 100); document.getElementById('filterPopupInput ...
- .net mvc 防止 xss 与 CSRF
CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站 ...
- 《C和指针》 读书笔记 -- 第11章 动态内存分配
1.C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和释放,这些函数维护一个可用内存池. void *malloc(size_t size);//返回指向分配的内存块起始位置的 ...
- 使用公钥登录SSL
在本地生成密钥对 ssh-keygen -t rsa 如果不想设置密码,可以直接点击回车. 如果你想使用DSA可以用-t DSA替换. 确保远程计算机上用户目录下有.ssh目录 确保你的连接服务器上的 ...
- 【IOS】分享下近一年IOS开发的经验总结
从上个暑假末到现在,自己做IOS开发也快一年了.从一开始的什么都不知道,到现在大多事都能搭上一两手,期间经历了很多事情.下面来和大家分享一下心得和感触. 1.现在移动领域的知识更新的很快,无论是IOS ...
- Js 获取当前时间
Js获取当前日期时间及其它操作 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整 ...
- 走进Vue.js
走进Vue.js Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式.本文旨在帮助大家认识Vue.js,了解Vue.js的开发流程,并进一步理解 ...