[Memory]C语言中的内存分配

原创 2015年07月11日 00:18:23
   问题描述:C语言中可用动态内存分配结构进行链接形成表、树等数据结构。
   内存分配函数:<stdlib.h>接口中的三个函数,
malloc--分配内存块并不进行初始化--原型:void *malloc(size_t size);
calloc--分配内存块并初始化为0--原型:void *calloc(size_t nmemb, size_tsize);
realloc--调整之前分配的内存块的大小--原型:void *realloc(void *ptr, size_tsize);
   调用内存分配函数成功会返回内存地址,返回类型是void*,空指针,又称万能指针(可以赋值给任何类型的指针变量),如果返回NULL,就说明分配失败,可以测试一次申请是否成功:
p = malloc(1000);
if (p == NULL) {  // 也可以是if(!p)
    // 分配失败
}
   给字符串数组动态分配空间在一些情况中可以节省内存,如一个一维字符指针数组,每个元素指向一个字符串,对于字符串长度不一样的情况,利用动态分配可以为每个字符串分配其适合的大小。
   同样,也可以不用提前为数组分配好固定的大小,可以在程序执行中根据需要申请内存,
float *p;
p = malloc(n*sizeof(float));  //p可以用下标方式访问其元素--p[…]
   calloc会清除分配的内存,可为不同于数组的任何类型的数据项分配空间,例如结构体。第一个参数是此种数据类型的个数,第二个参数是该数据类型所占字节数,例如为一个结构体分配内存空间时:
struct point
{
    int x,y;
    float z;
}*p;
p = calloc(1,sizeof(struct point));
   存储空间的释放:
   通过内存分配函数获得的内存块来自heap存储池,频繁的调用内存分配函数而不加以释放的话,heap的空间最终会被耗尽,将导致无法再继续动态分配内存了。
   有时候将内存分配函数返回的内存块给一个指针,程序执行中可能会把该指针指向其他内存块,这时如果没有释放原内存块,这一空间就无法再被使用,形成内存垃圾(内存泄漏)。C语言必须保证手动释放这些内存块,防止内存泄漏。
    释放内存的函数free:
void free(void *ptr);
   悬空指针:有时候可能有一个或多个指针(*p,*q,*r)指向分配的内存块,如果此时对其中一个指针使用了内存释放(free(p)),那这时候p,q,r三个指针都成为悬空指针,因为它们指向的内存空间已经被释放不存在了,如果再对这些指针用于操作,会出现不预期的结果。
版权声明:本文为博主原创文章,未经博主允许不得转载。

C语言getmemory使用

1.关于动态申请内存的问题 出现率极高 程序的局部变量存在于(栈)中 程序的全局变量存在于(静态存储区)中 程序动态申请的数据存在于(堆)中 [...
  • daidi1989
  • daidi1989
  • 2016年03月09日 13:26
  • 305

C语言中的内存布局

今天老师讲了C语言中的内存布局情况特地记录下来 C程序程序空间布局 1)、正文段:也可称为代码段或代码节,该段特点如下: ·此段为共享段; ·运行时,内存会复制一份该段的副本; ·为只读,目的是...
  • Captain_MXD
  • Captain_MXD
  • 2016年08月09日 17:13
  • 240

进程间通信之共享内存shared memory

共享内存是一种简单而高效的进程间通信方法。管道,消息队列等通信方法需要在主存和用户空间之间进行4次数据复制,而共享内存只需要2次。分析如下: 管道,消息队列等: 第一次:数据产生后需要写入进程A的...
  • yilonglucky
  • yilonglucky
  • 2015年04月15日 11:24
  • 786

动态内存分配的C代码示例

之前有同学在QQ上问我,C语言中的动态内存分配是怎么回事。首先,我们来看看内存分配的概念,它是指在程序执行的过程中分配或者回收存储空间的方法。一般说来,内存分配方法分为静态内存分配和动态内存分配两种。...
  • zhouzxi
  • zhouzxi
  • 2016年09月02日 20:58
  • 3848

C语言从零开始——memory初识

####   1,栈段内存   #### /*         1,栈段内存:函数一旦调用结束,就释放所有内部栈内存。声明周期是临时的。作用域只在花括号内 */ #include int...
  • fsx2550553488
  • fsx2550553488
  • 2018年01月12日 18:36
  • 5

页面置换算法

1. FIFO,Optimal,LRU这三种置换算法的优劣? 优点: ①     FIFO页面置换算法实现简单,要求的硬件支持较少。 ②     Optimal页面置换算法可保证获得最低...
  • AaricYang
  • AaricYang
  • 2017年06月04日 21:18
  • 1347

漫谈C++11多线程内存模型

写在前面 “C++11 feels like a new language” - Bjarne Stroustrup 的确,C++11核心已经发生了巨大的变化,它现在支持Lambda表达式、对象类型自...
  • cszhouwei
  • cszhouwei
  • 2013年09月16日 13:54
  • 16167

JNA释放Memory对象分配的内存

手动释放JNA中Memory对象所分配本地内存空间
  • jhgy2
  • jhgy2
  • 2016年09月20日 23:24
  • 2008

C语言的变量的内存分配

今晚看了人家写的一个关于C语言内存分配的帖子,发现真是自己想找的,于是乎就收藏了。。。 先看一下两段代码: char* toStr() { char *s = "abcdefghijkl"; r...
  • chenyiming_1990
  • chenyiming_1990
  • 2013年07月26日 00:57
  • 8622

关于c语言中EOF用法的理解

作者:zhangxinlin 转载请注明,原文链接:http://blog.csdn.net/zhang429350061/article/details/8760636 首先看一下EOF...
  • zhang429350061
  • zhang429350061
  • 2013年04月05日 12:46
  • 2430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Memory]C语言中的内存分配
举报原因:
原因补充:

(最多只允许输入30个字)