[指针四] 通过函数进行动态内存申请---二级指针、函数返回值

来源:互联网 发布:ye2系列电机绕组数据书 编辑:程序博客网 时间:2024/05/21 15:02

通常,在规范化编程中,我们期望重复做的事放在函数中实现。在程序中,我们有多个地方需要进行动态内存申请,每次都写重复的代码容易出错,看起来冗余不工整,这时我们可以编写一个函数,每次调用该函数来进行动态内存的申请,通常有两种方法可以实现:

1.通过二级指针做形参,返回在函数中申请的动态内存地址:

例如:

#include <stdio.h>#include <malloc.h>int memory_malloc(int **p, int size){*p = (int *)malloc(size*sizeof(int));//改变(0x0027fa10)中的值,将动态申请的内存地址(0x00316668)放在(0x0027fa10)指向的内存中。if(!p){printf("memory melloc failed!\n");return 0;}return 1;}int main(){int *pointer = NULL ,i = 0;//pointer指向的内存地址为0x00000000if(memory_malloc(&pointer,5))//将内存地址0x00000000的地址(0x0027fa10)作为参数传递给函数{//即,函数中动态申请的内存的地址,通过参数的形式传递给主函数for(i = 0;i < 5;i ++){pointer[i] = i;printf("%d ",pointer[i]);}}return 1;}


对于二级指针,做形参时传入地址(注意此时传入的是二级指针的地址),如果改变该二级指针地址(**p),对该指针的操作也将无效,但是改变二级指针的内容(例如*p),则该二级指针可以正常返回。

一级指针可以实现值的传递,二级指针可以实现地址的传递。

上面的二级指针,是将pointer指向的内存地址的指针通过参数的形式传递给函数,在函数中改变该二级指针的值,即pointer所指向的内存地址。从而达到动态分配内存地址,使pointer指向它,并且使用它。

2.使用一级指针实现内存申请,通过函数返回值带出malloc的地址:


#include <stdio.h>#include <malloc.h>char *my_malloc(int m){char *p;p=(char *)malloc(m);return p;//此处只能返回指向“堆内存”的指针,不能返回指向“栈内存”的指针,因为该“栈内存”在函数结束时自动消亡}int main(){char * buff = NULL;  //指针如果在函数内没有赋值,注意开始赋值为NULLbuff = my_malloc(10);printf("buff adress is %x\n",buff);free(buff); return 1;}


0 0
原创粉丝点击