malloc,realloc,free动态分配和释放内存

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/FEIFAZHE/article/details/79505578

1.    malloc(size_t _Size):

        动态分配_Size个字节内存,分配成功返回一个void*指针(需要强制转换所需类型),且指针未初始化(可以memset初始化),否则返回NULL,分配后建议或者一定要判断指针是否为NULL,再决定是否继续执行后面的代码.

    示例:

        int *pData = (int*)malloc(10*sizeof(int));

        注意:这块长度用了sizeof,可以在不同机器上正确使用。指针用完之后,一定要释放(free)。

        分配内存后,一定要注意指针使用是否越界。

2.    realloc(void *ptr,size_t new_Size)

        修改一个已经分配的内存大小(扩大或缩小)。

        当指针非空:

        a.    当修改内存小于原来的,则尾部部分内容被去掉;

        b.    当修改内存大于原来的,则在原先的内存块尾部新增内存;

        c.    如果原先的内存空间不足或原先的内存块无法改变大小,realloc将重新分配一个指定大小的内存,并把原先那块内存内容复制到新的内存块上,realloc返回的新指针。

3.    free:动态释放内存(与动态分配内存匹配出现)

    释放已动态分配的内存。这块必须释放,否则会出现无法预料的异常。

    示例:

        if(pData != NULL){

                free(pData);

                pData = NULL;

         }

对于内存的动态分配后指针的使用,一定要注意内存越界和使用完后及时释放。

如果感兴趣的话,可以研究下calloc函数

展开阅读全文

malloc & realloc

10-25

我想这样:一个结构(DealerInfo)用于存放数据库中一张表里的三个字段,另一个结构(QueryConf_3)用于存放指向第一个结构的指针和一个计数器;rn初始化时我用malloc给第QueryConf_3里的DealerInfo指针分配100个DealerInfo大小的空间,然后取数据库表,在取完100条记录后,再用realloc给那个结构指针再分配10个DealerInfo大小的空间,一直到取完所有的记录;rn运行后,发现在realloc时直接core dump了,:((((((rnBus Error - core dumprnrn哪位大侠帮我看看这是怎么回事啊!~rn程序如下:rnrn#include rn#include rn#include rn#include rnrnstruct DealerInfo rnunsigned char id[10];rnunsigned char name[21];rnunsigned short index;rn;rnrnstruct QueryConf_3 rnstruct DealerInfo *ptrDealerInfo;rnunsigned short dealerCount;rn;rnrnintrnmain(int argc, char **argv)rnrnstruct QueryConf_3 qConf;rnrnif(_InitDB() < 0) return -1;rnif(InitConf_3(&qConf) < 0) return -1;rnif(FillDealer(qConf, "EPEPECBJ") < 0) return -1;rnreturn 0;rnrnrnintrnInitConf_3(struct QueryConf_3 *qConf)rnrnbzero(qConf, sizeof(struct QueryConf_3));rnif((qConf->ptrDealerInfo = (struct DealerInfo *)rnmalloc(sizeof(struct DealerInfo) * 100)) == NULL) rnreturn DealError("malloc qConf->ptrDealerInfo error.");rnrnbzero(qConf->ptrDealerInfo, sizeof(struct DealerInfo)*100);rnreturn 0;rnrnrnintrnFillDealer(struct QueryConf_3 *qConf, const char *str)rnrnunsigned short maxCount = 100;rnstruct DealerInfo *ptr;rnrnEXEC SQL DECLARE cur_dealer_info CURSOR FORrnSELECT a.dealer_id, a.short_name, a.provincernFROM dealer_info a, province_info prnWHERE p.ecc_office_id = :str AND a.province = p.idrnORDER BY a.dealer_id;rnEXEC SQL OPEN cur_dealer_info;rnif(sqlca.sqlcode != 0)rnreturn DealSQLError("open cur_dealer_info error.");rnptr = qConf->ptrDealerInfo;rnfor(; rnEXEC SQL FETCH cur_dealer_info INTO tr;rnif (sqlca.sqlcode == 1403) break;rnelse if(sqlca.sqlcode != 0 ) rnDealSQLError("fetch cur_dealer_info error.");rnEXEC SQL CLOSE cur_dealer_info; return -1;rnrnrtrim(ptr->id); rtrim(ptr->name);rnif(qConf->dealerCount == maxCount) rnif(realloc((void *)qConf->ptrDealerInfo,rnsizeof(struct DealerInfo) * 10) == NULL) rnDealError("realloc qConf->ptrDealerInfo error.");rnEXEC SQL CLOSE cur_dealer_info; return -1;rnrnbzero((qConf->ptrDealerInfo + maxCount), rnsizeof(struct DealerInfo) * 10);rnmaxCount += 10;rnrnprintf("[%3d][%s][%s][%d].\n", qConf->dealerCount, ptr->id, ptr->name, ptr->index);rnptr->index = qConf->dealerCount++; ptr++;rnrnEXEC SQL CLOSE cur_dealer_info;rnprintf("count=[%s].\n", qConf->dealerCount);rnreturn 0;rnrnrnintrnDealError(char *str)rnrnprintf("%s\n", str);rnreturn -1;rnrnrnintrnDealSQLError(char *str)rnrnprintf("%s\n...[%d][%s].\n", str, sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);rnreturn -1;rnrnrnrn 论坛

free释放内存,程序崩溃了

05-25

大家给我看下这个单链表的问题吧,程序运行到下面标红色的地方就崩溃了,删除第二个节点时,释放内存就崩溃,删除其他节点没问题!……奇怪rn#include rn#include rnvoid menu()rn rn puts("\t[1] Create a linklist");rn puts("\t[2] Search");rn puts("\t[3] Insert");rn puts("\t[4] Delete");rn puts("\t[5] Print");rn puts("\t[6] exit");rn getchar();rn rnrnrntypedef struct node rn int num;rn struct node *link;rnstud;rnrnstud *createlink()rn stud *firstnode = (stud *)malloc(sizeof(stud));rn if(firstnode)rn firstnode->num = 0;rn return firstnode;rn rn return NULL;rnrnrnstud * insert(stud *head,stud *ele)rn ele->link = head;rn return ele;rnrnrnvoid print(stud *head)rn rn stud *sign = head;rn while(sign)rn printf("%d\n",sign->num);rn sign = sign->link;rn rnrnrnstud * mydelete(stud *head,int num)rn stud * sign ;rn stud * sign1;rn stud * sign2;rn sign = head;rn rn do rn sign1 = head->link;rn if (head->num == num)//判断首节点是否要删除 rn rn if(sign == head) rn sign2 = head; rn sign = sign1;rn rn rn /*rn elsern head = head->link;rn */rn free(sign2);rn return sign; rn rn rn if(sign1 == NULL)rn return sign;rn rn if(sign1->num == num)rn sign2 = sign1;rn rn rn head->link = sign1->link;rn rn // puts("Notice!");rn [color=#FF0000] free(sign2);[/color]rn rn return sign;rn rn head = sign1;rn rn while(1);rn rn return sign;rnrnint main()rnrnstud *stud1 = createlink();rnif(!stud1)rn puts("Can't create a linklist!");rn return 1;rn rnstud inserted1,inserted2,inserted3;rninserted1.num = 100;rninserted2.num= 200;rninserted3.num= 300;rnstud1 = insert(stud1,&inserted1);rnstud1 = insert(stud1,&inserted2);rnstud1 = insert(stud1,&inserted3);rnprint(stud1);rnputs("*******************************************");rn//getchar();rnstud1 = mydelete(stud1,200);rnrnprint(stud1);rnreturn 0;rn rn 论坛

没有更多推荐了,返回首页