1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 动态存储空间分配方式

动态存储空间分配方式

时间:2023-05-22 19:13:12

相关推荐

动态存储空间分配方式

malloc函数 free函数是什么:

malloc函数是一种分配长度为num_bytes字节的内存块的函数,可以向系统申请分配指定size个字节的内存空间。malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。

free函数是一种与malloc()函数配对使用,释放malloc函数申请的动态内存的函数。

动态分配和撤销内存的运算符new 和 delete

一.malloc

原型:extern void *malloc(unsigned int num_bytes);

使用格式(类型)malloc(长度) (char*)malloc(x*sizeof(char)) (int*)malloc(y*sizeof(int)) x,y代表实际分配的个数

头文件:#include<malloc.h>

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

例:

char *p; //指向字符的指针pp=(char *)malloc(10*sizeof(char)); //char*转换为字符指针,10*分配的字符个数,sizeof(char)求每个字符占用的空间strcpy(p,"china");cout<<"*p="<<*p<<endl;//*p为首字符地址cout<<"p="<<p<<endl<<endl;//p为字符串chinafree (p);int *q;//指向整型数据指针qq=(int *)malloc(5*sizeof(int));*q=10001;cout<<"*q="<<*q<<endl;//*q为10001free(q);

二:new运算符

new是 c++ 的一个关键字。被当作像 + 、 - 、 * 、 / 一样的操作符 。

• new 的作用 申请到指定数据类型大小的内存空间。

• new 的返回值 是申请到的内容空间的地址。

• new 的语法: new 数据类型

• 实际使用方法: 数据类型 指针变量 = new 数据类型 ;

new 将做三件事:

( 1 )主动计算指定数据类型需要的内存空间大小

( 2 )返回正确的指针类型

( 3 )在分配内存时,按照语法规则,初始化所分配的内存。

注意:用 new 分配数组空间时不能指定初值。

例:

• int * p ; // 声明了一个 p 指针,放在栈里面的

• p = new int(100); // 用 new 开辟的整型数据空间放在堆里面,此空间存储 100 ,指针 p 指向这块动态开辟的空间。

• *p=10 ; // 将 p 指针所指向的空间内容变为 10

• delete p ; // 把 p 指向内存释放掉

• 注意 :释放的动态开辟的空间,而指针 p 还是存在的,还在栈里面。

三.函数malloc声明(函数原型):

void *malloc(int size);

说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。这个在MSDN上可以找到相关的解释,具体内容如下:

mallocreturns a void pointer to the allocated space, orNULLif there is insufficient memory available. To return a pointer to a type other thanvoid, use a type cast on the return value. The storage space pointed to by the return value is guaranteed to be suitably aligned for storage of any type of object. If size is 0,mallocallocates a zero-length item in the heap and returns a valid pointer to that item. Always check the return frommalloc, even if the amount of memory requested is small.

四.malloc与new的不同点

从函数声明上可以看出。malloc 和 new 至少有两个不同:new 返回指定类型的指针,并且可以自动计算所需要大小。比如:

int *p;

p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);

或:

int* pa;

pa = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;

而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针

int* p;

p =(int *)malloc (sizeof(int));

第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。

第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:

int* p = (int *) malloc (2);

代码也能通过编译,但事实上只分配了2个字节大小的内存空间,当你往里头存入一个整数,就会有2个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。

malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。

比如想分配100个int类型的空间:

int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。

另外有一点不能直接看出的区别是,malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。

除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。

总结:

malloc()函数其实就在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上连续的,而在物理上可以连续也可以不连续。对于我们程序员来说,我们关注的是逻辑上的连续,因为操作系统会帮我们安排内存分配,所以我们使用起来就可以当做是连续的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。