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));
注:
(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.重复释放
一:分配内存空间函数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.重复释放
相关文章推荐
- C语言动态内存分配:(二)malloc/calloc/realloc/aligned_malloc
- C语言中malloc、calloc、realloc动态内存分配的理解
- 动态内存开辟malloc,calloc,realloc简述
- malloc与calloc,realloc动态内存的用法
- C语言之内存分配与释放:malloc, calloc, realloc & free
- C语言:使用realloc函数对malloc或者calloc动态分配的内存大小进行扩展
- C和指针之动态内存分配malloc、calloc、realloc简单使用和区别
- 内存动态分配之realloc(),malloc(),calloc()与new运算符
- C语言 内存分配 (malloc/realloc/calloc区别)
- 浅析C语言之内存分配函数malloc()、realloc()、calloc()
- C语言动态内存分配 :malloc() calloc()
- C语言malloc,calloc,realloc,free内存分配函数学习笔记
- 转载:C语言内存分配:malloc、calloc、realloc
- C语言内存分配方式及malloc,realloc,calloc,alloc.free函数
- linux C 之动态内存分配malloc ,calloc,realloc,free
- C语言三个内存分配函数比较,malloc calloc realloc
- C动态字符串,动态开辟内存空间相关 malloc realloc 用法
- C语言 calloc, malloc, realloc ,alloca以及 free的用法
- malloc,calloc,realloc等内存分配函数区别
- C语言realloc,malloc,calloc的区别【转载】