Ja5oN 发表于 2006-12-25 19:56

究竟什么内存可以用什么内存不可以用?请师兄帮我说明一下

我正在学习c语言,但到了指针那里有很多不明白,下面是一道课后习题和答案,我看不明白请高手指教
题目:写一个函数alloc(n),用来在内存区新开辟一个连续空间(n个字节)。此函数的返回值是一个地址,指向新开辟的连续空间的起始地址。再写一个函数free(p),将p地址起始的各个单元释放(不能再被程序使用,除非再度开辟)。

答案:
#define NULL 0                                 
#define ACLLOSOZE 1000                            //最大开辟存区      
char allocbuf;                            //开辟第一个存区
char *allocp=allocbuf;                                  //指针指向第一个可存取的区间的始端


char *alloc(int n)                                        //开辟存取区的函数
{if ( allocp+n<=allocbuf+ALLOCSIZE)            
   {allocp+=n;
       return(allocp-n);                                  //返回一个指针指向存区的开始位置
      }
else
       reyurn(NULL);                                    
}



void free(char*p)                                       //释放存区函数
{if(p>=allocbuf&&p>allocbuf+ALLOCSIZE)
alloc=p;
}

我想问什么样的内存空间才是可以用的?
char allocbuf;这句不是定义了一个1000字节的空间吗?里面的内存空间可以用吗?
allocp+=n;为什么把指针指向第n个地址后前面的空间就可以用后面的就不可以用?
释放空间那个函数又是什么原理?完全不懂!

帖子比较场不好意思,请高手帮我解决一下


[ 本帖最后由 Ja5oN 于 2006-12-25 20:56 编辑 ]

Leon001 发表于 2006-12-25 20:06

楼主检查下代码打错了没?那个int p??

Ja5oN 发表于 2006-12-25 20:57

不好意思,打错了,是char *alloc(int n)

iptton 发表于 2006-12-25 22:14

有部分答案我的帖子里有...楼主可以去看看

iptton 发表于 2006-12-25 22:36

申请能空纳10个char的空间有以下两种方法,alloc 与 malloc 属同一种方法 malloc 与 alloc 的函数使用方法有所不同, alloc 还会初始化(如果没记错的话)。

char *pcBuffer = alloc(10,sizeof(char));      
char buffer;


所谓“可用内存空间”
指的是系统充许你的程序使用的空间,
也就是你的程序向系统申请的空间

而释放指的是,你向系统说明该空间可以回收给其它程序使用了
需要释放的空间只限于用 malloc 和 alloc 申请的空间(即动态申请的)

之所以char buffer; 这样的语句申请的空间要释放吗?要!
不过不是你释放的,是系统帮你释放,只要程序执行超出 buffer 这个变
量所在的作用域,该空间就会被“释放”。

盼望 发表于 2006-12-25 23:02

无论分不分配,释不释放,任意内存都可以用
但如果没用malloc等内存管理函数来分配内存的话
就会造成读取时有奇怪的代码或写内存时会覆盖其他正在运行的程序
这样就是所谓的bug了

iptton 发表于 2006-12-25 23:24

楼上正解……

Ja5oN 发表于 2006-12-26 09:14

不好意思
char allocbuf;这句不是定义了一个1000字节的空间吗?里面的内存空间可以用吗?
allocp+=n;为什么把指针指向第n个地址后前面的空间就可以用后面的就不可以用?
这两个问题我还是不懂,能说详细一点吗?
还有这里的alloc函数不是库函数,而是自己定义的函数

Ja5oN 发表于 2006-12-26 09:21

原帖由 盼望 于 2006-12-25 23:02 发表
无论分不分配,释不释放,任意内存都可以用
但如果没用malloc等内存管理函数来分配内存的话
就会造成读取时有奇怪的代码或写内存时会覆盖其他正在运行的程序
这样就是所谓的bug了
是真的吗?

黯然销魂 发表于 2006-12-26 09:59

指针只是绝对的...你往哪指都可以...所谓不可用是因为, 超过你指针定义范围的地址可能为别变量代码程序的所使用, 如果你对这些地址进行操作, 将有可能对你的程序造成影响. 指针的使用不要超过自己所定义的范围,

例如, 在内存中开辟的连续空间int allocbuf, 而紧接着在int allocbuf后面的地址是循环控制变量int i的地址. 这样, 当你指针来到从allocbuf+ALLOCSIZE去到i这里对i进行操作的话, 如果你不幸陷入了由这个i所控制的循环, 那么, 你的程序就很有可能会乱套. 这样, 就会出现所谓的Bug.

黯然销魂 发表于 2006-12-26 10:03

空间的释放主要是程序动态申请的空间来说, 至于像char, int这些已经定义好的, 在程序运行初始化的时候便向系统申请的空间, 系统是会自动释放的. 题目应是叫你动态申请连续区域, 然后再动态连续释放.

[ 本帖最后由 黯然销魂 于 2006-12-26 10:05 编辑 ]

Ja5oN 发表于 2006-12-26 10:26

if ( allocp+n<=allocbuf+ALLOCSIZE)            
   {allocp+=n;
       return(allocp-n);   }
我想问这里allocp+=n有什么用?
前面不是已经用#define ACLLOSOZE 1000定义里一个1000字节的数组了吗?
里面的空间不是全部都可用吗?为什么函数里还要个allocp+=n,这里的allocp指针有什么用?

powerwind 发表于 2006-12-26 10:36


allocp+=n;
return(allocp-n);                                  //返回一个指针指向存区的开始位置


这两句看上去,似乎可以直接改成一句:return(allocp);
为什么要加上n,然后又减去n才返回呢?

我想答案的意思是:用allocp+=n;使allocp指针向前移动了n个单位,表示那n个单位的空间已经分配给人家了,下次调用该函数,要再分配空间给人家就从那n个单位之后开始。

释放的函数的也类似

[ 本帖最后由 powerwind 于 2006-12-26 10:37 编辑 ]

Ja5oN 发表于 2006-12-26 11:19

哦!谢谢!
那么在第二次分配函数之前
那个由alloc函数分配出来的空间实际上是不是1000
我是说当我们使用那个空间超过n时系统会不会报错?

黯然销魂 发表于 2006-12-26 11:21

我觉得不会(没有验证).
页: [1]
查看完整版本: 究竟什么内存可以用什么内存不可以用?请师兄帮我说明一下