动态内存:通常当用户无法确定空间大小,或者空间太大,栈上无法分配时采用。
静态内存:在程序开始运行时有编译器分配的内存,在编译时完成,不占用CPU资源。
两者区别:
函数原型:
void *malloc(unsigned int size);
该函数的功能是分配长度为size字节的内存块。
如果分配成功,则返回指向被分配内存的指针;否则返回空指针NULL。注意:当内存不再使用时,要使用free()函数释放内存块。
分配内存大小和返回指针类型都有自己决定。
#include<stdio.h> #include<stdlib.h> int main() { int* buffer; buffer = (int*)malloc(400); free(buffer); return 0; }
函数原型:
void *calloc(unsigned n,unsigned size);
该函数的功能是在内存的动态区存储中分配n个长度为size的内存块。
分配结果和malloc()相同,也要用free释放。
#include<stdio.h> #include<stdlib.h> int main() { int* buffer_m; int* buffer_c; int **buffer; int a[10]; buffer_m = (int *)malloc(20 * sizeof(int)); free(buffer_m); buffer_c = (int *)calloc(20, sizeof(int)); //和malloc效果相同 free(buffer_c); return 0; }
函数原型:
void *realloc(void *mem_address,unsigned int newsize);
该函数的功能是改变原mem_adress所指向的内存区域的大小为newsize。
重新分配空间并将原空间内容复制过来,成功返回地址,否则返回NULL。
函数原型为:
void *memset(void *s,char ch,unsigned n);
该函数功能是设置s中所有的字节为ch,s数组的大小为n。
注意:是按字节赋值
#include<stdio.h> #include<stdlib.h> #include<string.h> void show(int *a,int n) { int i = 0; for (i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n----------\n"); } int main() { int a[10] = { 1,2,3,4,5 }; int i; memset(a, 0, sizeof(a)); //都赋值为0, show(&a,10); memset(a, -1, sizeof(a)); //都赋值为-1, show(&a, 10); memset(a, 1, sizeof(a)); //都赋值为1??? show(&a, 10); return 0; }
动态申请内存一定要手动释放该内存空间。free()
函数原型:
void free(void *memblock);
原文:http://www.cnblogs.com/DreamZero/p/5071249.html