您的位置:首页 > 其它

内存管理

2015-12-23 20:52 162 查看
window.onload = function() {
dp.SyntaxHighlighter.ClipboardSwf = 'http://files.cnblogs.com/DreamZero/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
};
动态内存:通常当用户无法确定空间大小,或者空间太大,栈上无法分配时采用。

静态内存:在程序开始运行时有编译器分配的内存,在编译时完成,不占用CPU资源。

两者区别:

静态内存的分配是在程序开始编译时完成的,不占用CPU资源;而动态内存的分配是在程序运行时完成的,动态内存的分配与释放都是占用CPU资源的。 静态内存是在栈上分配的;动态内存是在堆上分配的。 动态内存分配需要指针和引用数据类型的支持,而静态内存不需要。 静态内存分配是在编译前就已经确定了内存块的大小,属于按计划分配内存;而动态内存的分配是在程序运行过程中,根据需要随时分配的,属于按需分配。 静态内存的控制权是交给编译器的,而动态内存的控制权是由自己决定的。

分配内存

malloc()函数

函数原型:

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;

}


2.calloc()函数

函数原型:

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;

}

3.realloc()函数

函数原型:

void *realloc(void *mem_address,unsigned int newsize);

该函数的功能是改变原mem_adress所指向的内存区域的大小为newsize。

重新分配空间并将原空间内容复制过来,成功返回地址,否则返回NULL。

4.memset()函数

函数原型为:

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: