C语言中动态分配内存

标签: 语言 内存 | 发表时间:2013-10-27 18:07 | 作者:u011747846
出处:http://blog.csdn.net

什么是内存动态分配:全局变量是分配在内存中的静态存储区的,非静态的局部变量(包括形参)是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域。所谓动态分配内存指的是C语言允许建立内存动态分配区域,需要时开辟,不需要时释放,这个动态存储区成为堆。


怎样建立内存的动态分配:主要有四个库函数:malloc   calloc   free  realloc

        1.malloc函数    void  *malloc(unsigned  int  size)

           作用是在内存中分配一个长度为size的连续空间,返回值是指针。如果分配失败,返回NULL。

        2.calloc 函数    void  *calloc(unsigned  n, unsigned   size)

           作用是在内存中分配n个长度为size的连续空间,返回起始地址。若果分配失败,返回NULL。用calloc函数可以建立动态数组,n为数组元素个数,size为每个元素的长度。

        3.free函数         void  *free(void  *p)

           释放由p所指向的动态存储区,无返回值。

         4.realloc函数   void  *realloc(void  *p,unsigned   int   size)

           用于改变有malloc或者calloc开辟的动态区域的大小。若失败,则返回NULL。


注意:除free函数外,每个函数的返回值都是void *  型的指针。在使用这几个函数时,要进行强制类型转换。这几个函数同在C++中的<cstdlib>中。


void 指针类型:不指向任何具体的数据。不要理解为指向任意类型,而是空类型,不指向任何类型,需要强制转换才能赋值给其他类型的指针。


例子源代码:


#include<iostream>
#include<cstdlib>
using namespace std;


int main()
{
    void check(int *);  //由于函数出现在定义之前,故需要申明 
    int *p1,i;          //p1为指向整型变量的指针 
    void *p2;           //p2为指向void型的指针 
    p2=malloc(5*sizeof(int));//sizeof()为求类型的字节数 
    p1=(int *)p2;       //强制类型转换 
    for(i=0;i<5;++i)
        scanf("%d",p1+i); //随机访问 
    check(p1);
    free(p2);             //释放p2所指向的区域 
}


void check(int *p)    
{
     int i;
     printf("They are fail:");
     for(i=0;i<5;++i)
         if(p[i]<60)printf("%d",p[i]);
     printf("\n");


知识总是要一点一点积累的,欲速则不达...

作者:u011747846 发表于2013-10-27 10:07:09 原文链接
阅读:0 评论:0 查看评论

相关 [语言 内存] 推荐:

C语言中动态分配内存

- - CSDN博客推荐文章
什么是内存动态分配:全局变量是分配在内存中的静态存储区的,非静态的局部变量(包括形参)是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域. 所谓动态分配内存指的是C语言允许建立内存动态分配区域,需要时开辟,不需要时释放,这个动态存储区成为堆. 怎样建立内存的动态分配:主要有四个库函数:malloc   calloc   free  realloc.

[翻译]理解 GO 语言的内存使用

- - 学习笔记
许多人在刚开始接触 Go 语言时,经常会有的疑惑就是“为什么一个 Hello world 会占用如此之多的内存. Understanding Go Lang Memory Usage 很好的解释了这个问题. 不过“简介”就是“简介”,更加深入的内容恐怕要读者自己去探索了. 另外,文章写到最后,作者飘了,估计引起了一些公愤,于是又自己给自己补刀,左一刀,右一刀…….

语言壁垒

- kylexlau - Chun Tian (binghe)
虽然经常更新微博,但确实又有些日子没写常规博客了. 10 月开始前有必要再写一篇,整理一下近期的各种思路,以良好的精神面貌迎接今年的最后一个季度. 首先发布一个已经不太新的消息:Practical Common Lisp 的中文版《实用 Common Lisp 编程》几经周折终于付印了,下月即可正式出版;读者们甚至已经可以在当当网上预订了.

UnQL:NoSQL查询语言

- 卡飞菲 - Solidot
CouchDB作者Damien Katz与SQLite作者Richard Hipp正在为NoSQL文档数据库开发一种高级查询语言UnQL(发音同Uncle,是UNstructured Query Language的缩写). Katz表示,他们坚信为了推广NoSQL需要一种通用的查询语言,类似当年推广关系型数据库应运而生的SQL语言.

Go 语言初步

- wei - 云风的 BLOG
所谓认真玩,就是拿 Go 写点程序,前后大约两千行吧. 据说 Go 的最佳开发平台是 Mac OS ,我没有. Windows 版还没全部搞定,但是也可以用了. 如果你用 google 搜索,很容易去到一个叫 go-windows 的开源项目上. 如果你用这个,很多库都没有,而且语法也是老的. 我在 Windows 下甚至不能正确链接自己写的多个 package.

C语言之父

- Dylen - 子说
同事说c语言之父去世了,另一个同事大吃一惊,问:谭浩强死了. 不知丹尼斯·里奇(Dennis Ritchie)情何以堪.

MongoDB与内存

- 高春辉 - 火丁笔记
但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了. 据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果:. 这台MongoDB服务器有没有性能问题. 先讲讲Linux是如何管理内存的.

内存泄漏

- - CSDN博客系统运维推荐文章
程序申请了堆空间,但是“忘记”释放,导致该块区域在程序结束前无法被再次使用导致的. 泄漏时间长了,就会导致用户空间内存不足,严重的导致死机. 如果泄漏比较严重,很容易察觉;但是有些泄漏很缓慢,不容易察觉,但是软件会运行很长时间后,会慢慢导致严重问题,而且当发现症状的时候,基本上已经是比较晚的时候了,想要识别泄漏,还是可以实现的,本篇文章来聊聊内存操作的原理.

liunx内存

- - 操作系统 - ITeye博客
             total       used       free     shared    buffers     cached. Mem:   15947      15707        240          0        473       2034.  Mem:表示物理内存统计 .