c语言malloc如何实现动态分配

2024-11-29 00:57:47
推荐回答(5个)
回答1:

  函数原型:extern void *malloc(unsigned int num_bytes);

  需要头文件:#include

  功能:分配长度为num_bytes字节的内存块

  返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。

  说明:关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。

  示例:

  /*取一列整数,并按升序排列他们,最后打印*/
  #include 
  #include 
  #include 
  int compare_integers(const void  *a,const void  *b)
  {
  int *pa = (int *)a;
  int *pb = (int *)b;
  /*return *pa>*pb?1:*pa<*pb?-1:0;*/
  return  *pa-*pb;
  }
  int main()
  {
  int *array;
  int n_values;
  int i;
  printf("how many values are there?");
  if(scanf("%d",&n_values)!=1||n_values<=0)
  {
  printf("illegal number of values.\n");
  exit(EXIT_FAILURE);
  }
  array = (int *)malloc(n_values*sizeof(int));//分配内存,用于存储这些值
  if(array==NULL)
  {
  printf("can't get memory for that many values.\n");
  exit(EXIT_FAILURE);
  }
  for(i=0;i  {
  printf("?");
  if(scanf("%d",array+i)!=1)
  {
  printf("ERROR reading value #%d\n",i);
  free(array);
  exit(EXIT_FAILURE);
  }
  }
  qsort(array,n_values,sizeof(int),compare_integers);//使用快速排序法进行排序
  for(i=0;i  {
  printf("%d\n",array[i]);
  }
  free(array);
  return EXIT_SUCCESS;
  }

回答2:

动态的意思是和静态对比的.那我们先看一下静态是什么.当我们写一个程序的时候要定义一个放置名字的数组.中国人的名字很短最长也就是6,7个字所以在程序一开始的时候定义一个数组像这样char name[10];这样足够放置名字了.这个定义就是静态的也就是说这个数组的大小是在写程序的时候就已经定下来.但是很多时候我们写程序的时候不知道一个数组要多大的空间.比如一个帖子的内容.可能是5个字也可能是100个字也可能成千上万.如果所有的帖子的内容的数组都使用content[10000]那对于5个字的帖子这就是浪费空间.所以现在需要一种能在程序运行的时候(因为运行的时候都是知道确切的知道需要的大小的)定义存储空间的办法这个就是malloc动态分配的意思.也就是说程序中运行的时候分配空间大小.而不是在你写程序的时候就规定死大小.关于malloc定义的时候需要大小你这个是个误解..其实你的程序可以在运行的时候传入大小.比如定义个变量int size = 0;当你运行的时候可以动态改变这个size变量的值.然后使用malloc来分配空间.int *p = (int*)malloc(size);这样你就可以在运行的时候控制分配空间的大小了

回答3:

malloc如何实现动态分配
就是你可以根据程序运行的状态动态的分配内存;
如:p=(int *)malloc(10*sizeof(int))
这里面10,是常量,这样的分配当然就没体现出动态
如果把10改成以变量num,p=(int *)malloc(num*sizeof(int)),num是你事先不知道的值,只有在程序运行中,才能得到此变量的值,这是就根据num的值动态的分配所需要的内存大小

回答4:

@@内容摘要:以简单的C代码介绍malloc应该具有的功能和接口,也许各种分配器算法差异很大,但其按照标准C约定,所提供给用户的接口必须一样,功能也一样(性能有差异)。@@

Malloc的简单实现C标准库中提供的手工管理内存的函数定义在stdlib.h,包括以下四个函数:

void *calloc(size_t num, size_t size);
void free(void *);
void *malloc(size_t);
void *realloc(void *block, size_t size);

其中malloc/free大家比较熟悉,我们的示例中仅仅简单的将应用的内存请求转交给操作系统(^_^)处理:

//关于GetProcessHeap(),HeapAlloc(),HeapFree()的用法请参考MSDN。
HADLE
handle = GetProcessHeap();
void malloc(size_t size)
{
return HeapAlloc(handle,HEAP_ZERO_MEMORY, size);
}

void free(void * mem)
{
return HeapFree(handle,HEAP_NO_SERIALIZE,mem);
}
对于calloc/realloc可能有些陌生,下面通过两端小代码介绍calloc/realloc的原理。我们使用malloc/free来实现calloc/realloc,真正做事情的是malloc和free:

void *calloc(size_t num, size_t size)
{
void *ptr = NULL;
size_t nbytes = 0;
nbytes = num*size;

ptr = malloc(nbytes);

if(ptr!=NULL){ memset(ptr, 0x0,nbytes); }

return ptr;
}

void *realloc(void *ptr, size_t size)
{
unsigned char *cptr = NULL;
int oldsize = 0;
if (ptr == NULL){ return malloc(size); }
oldsize = sizeMem(ptr);
if (size <= oldsize){ return ptr; }
cptr = (char *)malloc(size);

memcpy(cptr, ptr, oldsize);
free(ptr);

return cptr;
}

通过上面两端小代码,对于calloc/realloc的作用应该很清楚了吧,当然实际的内存库实现中很少有用通过malloc/free来实现realloc的,因为在realloc向扩展内存的时候,分配器会真的尝试能否扩展,只有扩展不成功的时候才会进行类似上面事例的代码进行一次内存拷贝。

至于malloc和free的实现在各个平台下的各个Libc发布版本中差异很大。Unix通常通过brk系统调用实现。
Brk不是POSIX标准,但几乎所有Unix系统都提供这个函数,如果你对这个函数的实现有兴趣,可以参考Linux的/usr/src/linux/mm/mmap.c 。

接下来我们将分别介绍]广泛应用的Linux libc的dlmalloc,FreeBSD libc的phkmalloc,Solaris libc的malloc系列。在这之后再介绍C++对象内存管理需要思考的问题,以及sgi STL介绍。
最后介绍多核或多处理器环境下的内存管理算法Hoard,然后再次讨论小对象分配技术。

我原来在网上看到的 希望对你有用

回答5:

不知道的请不要乱说,误人子弟。
1.malloc总是和free配对出现的,这体现了对内存高效和安全的操作。
2.编译器对数组是在编译时就确定期其大小的,malloc是在程序运行期间分配空间的。