⑴ 求助:用C語言指針編寫一個函數alloc(n) 在內存區開辟和釋放一個連續空間
char _gacMemBlk[1000];
char * _gpcMemBlkBgn = _gacMemBlk;
int _giPos = 0;
void * alloc(int n)
{
if (1000 - _giPos < n)
return NULL;
char * p = _gpcMemBlkBgn + _giPos;
_giPos += n;
return (void *)p;
}
void free(void * p)
{
}
// 註:alloc, free不像你描述的那麼簡單,其實每次分配還要用一個連表記錄下來其位置和大小,而每次分配不一定要從末尾開始分,而是在連表中找一塊空白的,分一砣,剩下的又是一塊插到連表中,而釋放的時候,如果前後更好挨著,則需要合並
⑵ C語言 指針函數 釋放內存
一時看不明白你的代碼。一個原則是,start指向了誰。如果指向了在這個函數中定義的臨時自動型數組,那必然存在返回局部數組指針的問題,就是你說的內存釋放問題。這樣雖然指針被返回了,但它指向的內容已經不受代碼控制了,很危險。但如果start指向的是在主函數中聲明的數組,或是全局或靜態數組(這個函數中定義的靜態數組也行),或者是用動態分配法獲得的內存空間且未曾釋放,則不存在任何問題,是完全合理合法的。用動態分配法時要注意在不用時釋放內存空間,以免造成內存泄漏。
⑶ C語言 函數內指針返回後的釋放問題
不會釋放。
正確。
⑷ C語言 指針編寫一個函數alloc(n) 在內存區開辟和釋放一個連續空間
#include <stdio.h>
#define LEN (1000)
unsigned char base[LEN];
unsigned char *p=(unsigned char *)base;
void *Alloc(unsigned int n)
{
unsigned char *pp=p;
if(p+sizeof(unsigned int)+n<base+LEN&&n>0)
{
*(unsigned int*)p=n;
p+=sizeof(unsigned int)+n;
pp+=sizeof(unsigned int);
}
else
{
pp=NULL;
}
return pp;
}
void Free(unsigned char *ptr)
{
if(!ptr)
return;
p-=sizeof(unsigned int)+*(unsigned int *)(ptr-sizeof(unsigned int));
}
int main()
{
unsigned char *a=NULL;
printf("base=%p,p=%p,a=%p\n",base,p,a);
a=Alloc(10);
printf("base=%p,p=%p,a=%p\n",base,p,a);
Free(a);
printf("base=%p,p=%p,a=%p\n",base,p,a);
return 0;
}
⑸ C語言 內存釋放的問題
1、這樣沒有問題,不會造成內存泄露
2、當你不再使用這個buffer變數的時候就 free(buffer),buffer地址指向的空間就被釋放掉了
在你的主函數中 這樣使用
A *buffer=function();
//這里使用buffer
free(buffer); //施放內存
//有這一句就不會內存泄露了
內存泄露是對內存失去了控制,造成了內存的浪費,所以你要控制住你分配的內存
內存泄露典型例子是這樣子的
A *buffer=function(); //buffer指向一段內存
buffer=function(); //buffer指向一段新內存,原來的內存沒有釋放,而且已經失去了對它的控制
⑹ C語言 指針的釋放問題
前提是這個指針使用malloc、realloc、calloc動態申請來的,當你不使用這個指針時,就釋放掉,在什麼地方釋放都是可以的,關鍵是這個指針沒有被修改過
⑺ C語言數組指針內存釋放
//用指針的指針當二維數組請參考以下代碼
#include<stdio.h>
#include<stdlib.h>
intmain(){
int**b;
b=(int**)malloc(sizeof(int*)*4);//二維數組b有4行
for(inti=0;i<4;i++)//替每行分配存儲空間
b[i]=(int*)malloc(sizeof(int)*3);//二維數組b每行3列
for(inti=0;i<4;++i)for(intj=0;j<3;j++)
b[i][j]=i*j;
for(inti=0;i<4;++i){
for(intj=0;j<3;j++)
printf("%5d",b[i][j]);
printf(" ");
}
for(inti=0;i<4;i++)
free(b[i]);//釋放每行的存儲空間
free(b);//釋放b
return0;
}
⑻ C語言中是如何釋放內存單元的;原理又是什麼
C管理內存大致可以理解為兩種,分配在棧上的,一個是分配在堆上的。
臨時變數,動態變數,分配在棧上,運行完,直接彈出棧,就沒了。
分配在堆上的內存,釋放的時候,基本上可以理解為,指針不指這里了。也就失去了對這塊內存的控制。其實所謂的釋放。字面意思容易讓人理解錯。
有些機器有些操作系統,會在釋放的時候清空這段內存,但是這種做法效率不高,但是安全,很少有機器這么做,多數都是所謂釋放,就是不讓你控制這塊內存了而已。