malloc的用法,C语言 关于malloc的用法
malloc的用法,C语言 关于malloc的用法详细介绍
本文目录一览: malloc函数的用法是什么?
malloc使用须要包括头文件:
#include 'stdlib.h'
例如:
int *p;
p = new int; /返回类型为int* 类型(整数型指针)。分配大小为 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回类型为 int* 类型(整数型指针)。分配大小为 sizeof(int) * 100;
而 malloc 则必须由我们计算要字节数,而且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int));
关于函数使用需要注意的一些地方:
1、申请了内存空间后,必须检查是否分配成功。
2、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
3、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
c语言中,malloc和free是什么意思?
malloc和free是C语言中申请内存空间与释放内存空间的函数。
函数原型:void *malloc(unsigned int size);
功 能:在内存的动态存储区中分配一个长度为size的连续空间。
返 回 值:指向所分配的连续存储域的起始地址的指针,若失败,返回NULL
函数原型:void free(void *p);
功 能:释放指针p所指向的内存区
返 回 值:无
举例如下:
int *p; // 定义一个int类型的指针p = (int *)malloc(4); // 分配4个连续的内存单元给指针pfree(p); // 释放指针p所指向的内存单元
他们内存管理的两个函数,malloc是申请内存的,free是释放内存的
c语言的核心,一个是指针,一个就是内存管理。
malloc是动态分配空间的意思。
一般用法
int *t=NULL;
t=(int *)malloc(sizeof(int));
也可以在sizeof前面加上一个'n*'这就成了一个动态分配数组的方法。
free是释放空间的意思。
一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
free(t);
这样t所指的空间就被释放掉了。
动态申请空间,后面的是释放空间
前面是比如*p=(void*)malloc(sizeof());
free(p);
申请要是不释放的就会占用内存的使用,记住都是在堆里面申请,不是栈
malloc是申请分配一块内存区域来存放指针
free是释放申请区域
用法:
malloc
http://baike.baidu.com/view/736228.html?wtp=tt
free
http://baike.baidu.com/view/512783.htm
属于内存管理的两个函数,malloc是申请内存的,free是释放内存的。
1、malloc一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
也可以在sizeof前面加上一个'n*'这就成了一个动态分配数组的方法。
2、free一般用法:
int *t=NULL;
t=(int *)malloc(sizeof(int));
free(t);
这样t所指的空间就被释放掉了。
扩展资料:
malloc函数定义
其函数原型为void *malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
参考资料来源:百度百科-malloc函数
参考资料来源:百度百科-free()
malloc函数的用法是什么?
C语言中malloc是动态内存分配函数。
函数原型:void *malloc(unsigned int num_bytes);
参数:num_bytes 是无符号整型,用于表示分配的字节数。
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)
功能:分配长度为num_bytes字节的内存块
注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
扩展资料:
实现malloc的方法:
(1)数据结构
首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。
(2)寻找合适的block
现在考虑如何在block链中查找合适的block。一般来说有两种查找算法:
First fit:从头开始,使用第一个数据区大小大于要求size的块所谓此次分配的块
Best fit:从头开始,遍历所有块,使用数据区大小大于size且差值最小的块作为此次分配的块
两种方式各有千秋,best fit有较高的内存使用率(payload较高),而first fit具有较高的运行效率。这里我们采用first fit算法。
malloc怎么使用,请举例说明,谢谢!
malloc 原型:extern void *malloc(unsigned int num_bytes);
用法:#include
或#include
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
malloc的语法是:指针名=(数据类型*)malloc(长度),(数据类型*)表示指针.
malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。
动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。本文简单介绍动态内存分配函数malloc()及几种实现方法。
1. 简介
malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。
2. 函数说明
C语言的动态存储管理由一组标准库函数实现,其原型在标准文件
里描述,需要用这些功能时应包含这个文件。与动态存储分配有关的函数共有四个,其中就包括存储分配函数malloc()。函数原型是:void *malloc (size_t n);这里的size_t是标准库里定义的一个类型,它是一个无符号整型。这个整型能够满足所有对存储块大小描述的需要,具体相当于哪个整型由具体的C系统确定。malloc的返回值为(void *)类型(这是通用指针的一个重要用途),它分配一片能存放大小为n的数据的存储块,返回对应的指针值;如果不能满足申请(找不到能满足要求的存储块)就返回NULL。在使用时,应该把malloc的返回值转换到特定指针类型,赋给一个指针。
注意,虽然这里的存储块是通过动态分配得到的,但是它的大小也是确定的,同样不允许越界使用。例如上面程序段分配的块里能存n个双精度数据,随后的使用就必须在这个范围内进行。越界使用动态分配的存储块,尤其是越界赋值,可能引起非常严重的后果,通常会破坏程序的运行系统,可能造成本程序或者整个计算机系统垮台。
下例是一个动态分配的例子:
#include
#include
main()
{
int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/
count=100;
if((array=(int *)malloc(10*sizeof(int))) == NULL)
{
printf("不能成功分配存储空间。");
exit(1);
}
for(count=0;count<10;count++) /*给数组赋值*/
array[count]=count;
for(count=0;count<10;count++) /*打印数组元素*/
printf("%2d",array[count]);
}
上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array=(int *) malloc (10*sizeof(int)))==NULL)语句可以分为以下几步:
1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
2)把此整型指针地址赋给array
3)检测返回值是否为NULL
char *p,
p=(char*)malloc(char)
是申请一个动态单元的函数
原形是void * malloc(单元大小)
返回值是一个指针,是个地址
单元大小可以是2,3,4,随便写,与具体环境有关
例如,struct num{int i,long j;}*p;
你就可以这样写p=(struct num* )malloc(sizeof(struct student))就是分配一个大小为sizeof(struct student )的单元给指针p
申请动态内存
char型的:
char* ch = (char*)malloc(sizeof(char)*n)
里面n为你要申请的字节个数
int型的:
int* nNum = (int*)malloc(sizeof(int)*n)
里面n为你要申请的每四字节的个数。
用完后最后要free(ch)掉你申请的内存空间,以免内存泄漏
malloc使用须要包括头文件:
#include 'stdlib.h'
例如:
int *p;
p = new int; /返回类型为int* 类型(整数型指针)。分配大小为 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回类型为 int* 类型(整数型指针)。分配大小为 sizeof(int) * 100;
而 malloc 则必须由我们计算要字节数,而且在返回后强行转换为实际类型的指针。
int* p;
p = (int *) malloc (sizeof(int));
扩展资料:malloc 函数返回的是 void * 类型。
对于C++,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。
所以必须通过 (int *) 来将强制转换。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,养成强制转换的习惯。
在Linux中可以有这样:malloc(0),这是因为Linux中malloc有一个下限值16Bytes,注意malloc(-1)是禁止的;但是在某些系统中是不允许malloc(0)的。
在规范的程序中我们有必要按照这样的格式去使用malloc及free:
type *p;
if(NULL == (p = (type*)malloc(sizeof(type))))
/*请使用if来判断,这是有必要的*/
{
perror("error...");
exit(1);
}
.../*其它代码*/
free(p);
p = NULL;/*请加上这句*/
C语言中的malloc函数用法)?
用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。
常用的内存管理函数有以下三个:
1. 分配内存空间函数malloc
调用形式:
(类型说明符*)malloc(size)
功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。
“类型说明符”表示把该区域用于何种数据类型。
(类型说明符*)表示把返回值强制转换为该类型指针。
“size”是一个无符号数。
例如:
pc=(char *)malloc(100);
表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。
2. 分配内存空间函数 calloc
calloc 也用于分配内存空间。
调用形式:
(类型说明符*)calloc(n,size)
功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。
(类型说明符*)用于强制类型转换。
calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。
例如:
ps=(struet stu*)calloc(2,sizeof(struct stu));
其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。
2. 释放内存空间函数free
调用形式:
free(void*ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。
【例】分配一块区域,输入一个学生数据。
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex='M';
ps->score=62.5;
printf("Number=%d\nName=%s\n",ps->num,ps->name);
printf("Sex=%c\nScore=%f\n",ps->sex,ps->score);
free(ps);
}
本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu大内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。
可以用,两者的区别在于,一个是创建静态内存,一个是动态内存。
只是你要做成服务程序或者有基于这个数组的算法时,别忘记用完p之后要free(),并且让p=(int*)NULL
void main()
{
int a[5],*p ;
p=a;
p=(int*)malloc(5*sizeof(int)) ;
//此处这样写有问题,根本就没必要动态分配内存,因为p指向的是一个数组,数组已经定义,也就是已经分配了空间,纯粹多余
for(int i=0;i<5;i++) scanf("%d",p++);
free(p);
}
malloc()是是在内存的动态存储区中分配一个长度为size的连续空间。
当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为
NULL并执行相应的操作
malloc分配的内存是位于堆中的,并且没有初始化内存的内容使用了malloc没有使用free,注意释放内存
p=(int *)malloc(5*sizeof(int)) /*这个也就是说P指向的连续5个空间的首地址*/
for(i=0;i<5;i++) scanf("%d",p++);
用法没 问题,但是问题是。。你最后p指向了 数组的最后,。。
你还要调整p,scanf("%d",(p+i))多好啊
动态申请1维数组,int *a;
a=(int *)malloc(5*sizeof(int)) ;
for(i=0;i<5;i++) scanf("%d",p++);
以后你就可以引用a数组了
第二种用法有点问题,应该这样改一下:
int *arr = (int *)malloc(5 * sizeof(int));
int *p = arr;
int i;
for (i = 0; i < 5; ++i)
scanf("%d", p++);
...
...
free(arr);
C语言中malloc是动态内存分配函数。
函数原型:void *malloc(unsigned int num_bytes)。
参数:num_bytes 是无符号整型,用于表示分配的字节数。
注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
实现malloc的方法:
首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。
C语言 关于malloc的用法
函数的形参指针,对指针进行sizeof操作,只能得到指针在内存中所占的大小,而不是指针所指向的内容的大小。
在这个函数中,你若想知道*a1和*a2的长度,确保字符串结尾存在'\0'后,可以用strlen得到字符串长度。如果字符串中没有结束符,只能在函数的参数中带入字符串的长度,在函数中直接分配空间。
问题出在你的sizeof使用错误,sizeof输入的是指针变量,而指针变量的大小在32位下统一是4个字节,因此x和y总会是4。如果a1和a2均指向字符串的话,可以用strlen去获取字符串长度(注意字符串是有'\0'来做结束符),另外你的a3应该定义成指针变量,如char *a3,这样才可以a3=(char *)malloc(z);
char *a3;x=strlen(a1);y=strlen(a2);z=x+y+1;a3=(char *)malloc(z);
malloc是分配动态数组存储空间的函数,引用它必需包含头文件"malloc.h"或"stdlib.h",malloc的作用是分配指定字节个内存空间,并返回该内存空间的首地址,但在赋值前必需进行强制类型转换。至于之后p其实就可以作为普通数组进行使用了,你的程序中少了free(p);,要将malloc的空间进行释放。
malloc是什么意思呢?怎么用?
malloc函数向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
函数声明:void *malloc(size_t size),void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据。
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。
C#语言里一个分配内存的函数吧
原型:extern void *malloc(unsigned int num_bytes);
用法:#include
或#include
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
malloc的语法是:指针名=(数据类型*)malloc(长度),(数据类型*)表示指针.
举例:
// malloc.c
#include
#include
main()
{
char *p;
clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);
getchar();
return 0;
}
C语言中的动态内存分配的用法举例
要实现根据程序的需要动态分配存储空间,就必须用到以下几个函数
1、malloc函数
malloc函数的原型为:
void *malloc (u igned int size)
其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。
下例是一个动态分配的程序:
#include
#include
main()
{
int count,*array; /*count是一个计数器,array是一个整型指针,也可以理解为指向一个整型数组的首地址*/
if((array(int *) malloc(10*sizeof(int)))==NULL)
{
printf("不能成功分配存储空间。");
exit(1);
}
for (count=0;count〈10;count++) /*给数组赋值*/
array[count]=count;
for(count=0;count〈10;count++) /*打印数组元素*/
printf("%2d",array[count]);
}
上例中动态分配了10个整型存储区域,然后进行赋值并打印。例中if((array(int *) malloc(10*sizeof(int)))==NULL)语句可以分为以下几步:
1)分配10个整型的连续存储空间,并返回一个指向其起始地址的整型指针
2)把此整型指针地址赋给array
3)检测返回值是否为NULL
2、free函数
由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。
其函数原型是:
void free(void *p)
作用是释放指针p所指向的内存区。
其参数p必须是先前调用malloc函数或calloc函数(另一个动态分配存储区域的函数)时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。
注意:这里重要的是指针的值,而不是用来申请动态内存的指针本身。例:
int *p1,*p2;
p1=malloc(10*sizeof(int));
p2=p1;
……
free(p2) /*或者free(p2)*/
malloc返回值赋给p1,又把p1的值赋给p2,所以此时p1,p2都可作为free函数的参数。
malloc函数是对存储区域进行分配的。
free函数是释放已经不用的内存区域的。
所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。
例如malloc,zizeof,free等
原型:extern void *malloc(unsigned int num_bytes);
用法:#include
功能:分配长度为num_bytes字节的内存块
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
举例:
// malloc.c
#include
#include
main()
{
char *p;
clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!\n");
free(p);
getchar();
return 0;
}
#include
#include
#define STR_LEN 4096
int main () {
char * str = malloc(STR_LEN);
scanf("%s", str);
printf("%s\n", str);
free(str);
return 0;
}
1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。
2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以便其它的变量或者程序使用。这时我们就要用到free函数。
3、calloc函数:其作用是在内存的动态存储区中分配n个长度为 size 的连续空间。函数返回一个指向分配区域的起始位置的指针;如果分配不成功,则返回NULL。
扩展资料:
函数运算符:
new
运算符new用于向系统申请动态存储空间,并把首地址作为运算结果,它的使用形式为:
指针变量=new 数据类型;
例如:
int *p=new int
该语句的作用是会用new从内存中申请了一个int型变量(4个字节),并将该变量的首地址赋给指针变量p。
new所建立的变量的初始值是任意的,也可在用new分配内存的同时进行初始化。使用形式为:
指针变量=new 数据类型(初始值)。
delete
堆内存可按照要求进行分配,程序对内存的需求量随时会发生变化,有时程序在运行种可能会不再需要由new分配的内存空间,而且程序还未运行结束,这时就需要把先前占用的内存空间释放给堆内存,以后重新分配,供程序的其他部分使用。运算符delete用于释放new分配的内存空间,删除建立的对象,它的使用形式为:
delete 指针变量;
其中的指针变量中保存着new分配的内存的首地址。
参考资料:百度百科--动态内存分配
c++中malloc的含义与用法
一、malloc()和free()的基本概念以及基本用法:
1、函数原型及说明:
void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
关于分配失败的原因,应该有多种,比如说空间不足就是一种。
void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
2、函数的用法:
其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:
程序代码:
// Code...
char *Ptr = NULL;
Ptr = (char *)malloc(100 * sizeof(char));
if (NULL == Ptr)
{
exit (1);
}
gets(Ptr);
// code...
free(Ptr);
Ptr = NULL;
// code...
就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。
3、关于函数使用需要注意的一些地方:
A、申请了内存空间后,必须检查是否分配成功。
B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会
出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一
些编译器的检查。
好了!最基础的东西大概这么说!现在进入第二部分:
二、malloc()到底从哪里得来了内存空间:
1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!
说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:
2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。
以上的概念描述是标准的描述,不过有个别语句被我删除,不知道因为这样而变得不标准了^_^.
通过上面对概念的描述,可以知道:
栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。
堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!