您的位置:首页 > 编程语言 > C语言/C++

C语言:动态内存malloc,calloc,realloc

2017-10-21 13:25 316 查看
动态内存是用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用的一种内存分配方式。

一:分配内存空间函数malloc:

 调用形式: (类型说明符*) malloc (size) 功能:在内存的动态存储区中分配一块长度为"size" 字节的连续区域。函数的返回值为该区域的首地址。 “类型说明符”表示把该区域用于何种数据类型。(类型说明符*)表示把返回值强制转换为该类型指针。“size”是一个无符号数。例如: pc=(char *) malloc (100); 表示分配100个字节的内存空间,并强制转换为字符数组类型, 函数的返回值为指向该字符数组的指针, 把该指针赋予指针变量pc。

二:动态内存与静态内存的区别:

a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用CPU资源。

b) 静态内存在栈(stack)上分配; 动态内存在堆(heap)上分配。

c) 动态内存分配需要指针和引用类型支持,静态不需要。

d) 静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。

三:创建动态数组,动态内存malloc引例:

筛选法求素数,我们并未知道是求多少以内的素数,我们为其申请一个动态内存,需要多少申请多少。

假如我们要求10以内的素数,我们为其分配一个4*10个字节大小的空间,即:int*p=(int*)malloc(10*sizeof(int));

void SiftPrime(int n)
{
 int *p = (int *)malloc(10*sizeof(int));
 assert(p != NULL);
 int i;
 for(i=0;i
 {
  p[i] = 1;
 }
 p[0] = 0;
 p[1] = 0;
 for(i=2;i<=sqrt((float)n);i++)
 {
  for(int j=i+1;j
  {
   if(j%i == 0)
   {
    p[j] = 0;
   }
  }
 }
 for(i=0;i
 {
  if(p[i] == 1)
  {
   printf("%d\n",i);
  }
 }
 free(p);
}


注:

(1)需要引用头文件 #include,

(2)申请内存时,要利用free释放内存,如果没有释放,则会出现内存泄漏。出现内存泄漏,则会使可用内存越来越小,设备速度越来越慢。

四:相关函数:calloc,realloc,

1. calloc:

colloc与malloc类似,但是主要的区别是存储在已分配的内存空间中的值默认为0,使用malloc时,已分配的内存中可以是任意的值.

colloc需要两个参数,第一个是需要分配内存的变量的个数,第二个是每个变量的大小.如:P=(int*)colloc(n,colloc(int));

即:

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

 int i;

 for(i=0;i<10;i++)

 {

  p[i] = i;

 }

等同于:

int*p=(int*)calloc(10,sizeof(int))//初始化每个格子为0

2.realloc:

更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。

如果是将分配的内存扩大,则有以下情况:

1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。

2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。

3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。

free崩溃原因:1.越界   2.指针指向的移动   3.重复释放
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: