首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

全局指针内存分配有关问题

2012-11-18 
全局指针内存分配问题我想开一段全局的buffer,但是buffer的大小可能会改变,比如说有的时候是100,有的时候

全局指针内存分配问题
我想开一段全局的buffer,但是buffer的大小可能会改变,比如说有的时候是100,有的时候是200,大小不定。很多人都是尽量开大一点,比如 static int buf[500]. 但是我想问一下为什么不开一个全局的指针呢,static int * buf =NULL, 然后需要多大的时候就malloc,不需要的时候就free呢。这样会有什么问题吗?

[解决办法]
使用一个全局指针,的确能够做到你要求的按需变大。那么为什么还是经常出现定义一个固定大小缓冲区的写法呢?
我们要知道,main(我们就以简单的c程序为例)是程序的入口函数,但是我们知道我们可以定义全局变量,那么这些全局变量又是有谁来初始化的呢?这是由c的运行时库的启动函数来实现的。也就是说,在我们执行main之前,如果我们定义了一个数组,那么这个数组的空间就被分配好了。如果没有分配好,而是使用malloc在程序运行中动态创建的话,我们可能会遇到两种情况:
(1)malloc分配失败而造成程序崩溃。
(2)由于malloc的分配过程影响程序性能。
排除这两种情况的话,用全局指针没有问题。不过记得初始化为NULL。
[解决办法]
多次malloc和free会产生内存碎片。

C/C++ code
//使用动态分配#include <stdio.h>#include <stdlib.h>#include <malloc.h>int i,L;char *p;void main() {    for (i=0;i<20000;i++) {        L=rand();        p=malloc(L);        if (NULL==p) {            printf("malloc error!\n");            continue;        }        memset(p,0,L);        free(p);    }}//不使用动态分配#include <stdio.h>#include <stdlib.h>#include <memory.h>#define MAXLEN 30000int i,L;char buf[MAXLEN];char *p;void main() {    p=&buf[0];    for (i=0;i<20000;i++) {        L=rand();        if (L>MAXLEN) {            printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);            L=MAXLEN;        }        memset(p,0,L);    }} 

热点排行