15.1内存组织方式
15.1.1内存的组织方式
开发人员将程序编写完成之后,程序需要先装载到计算机的内核或着半导体的内存中,再运行程序。程序被组织成以下4个逻辑段:
- 可执行代码
- 静态数据。可执行代码和静态数据存储在固定的内存位置。
- 动态数据(堆)。程序请求动态分配的内存来自内存池,也就是堆。
- 栈。局部数据对象、函数的参数以及调用函数和被调用函数的联系放在称为栈的内存池中。
以上4类根据操作平台和编译器的不同,堆和栈既可以是被所有同时运行的程序共享的操作系统资源,也可以是使用程序独占的局部资源。
15.1.2堆与栈
1.堆
在内存的全部存储空间中,用于程序动态分配和释放的内存快称为自由存储空间,通常称之为堆。
在C语言程序中,用malloc和free函数来从堆中动态地分配和释放内存。
#include<stdio.h>
int main()
{
int* pInt;
pInt = (int*)malloc(sizeof(int));
*pInt = 200;
printf("the number is :%d\n",*pInt);
free(pInt);
return 0;
}
2.栈
栈是一个后进先出的压入弹出式的数据结构。在程序运行时,需要每次向栈中压入一个对象,然后栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最晚进栈的对象将被弹出,然后栈指针向上移动一个位置。如果栈指针位于栈顶,则表示栈是空的;如果栈指针指向最下面的数据项的后一个位置,则表示栈为满的。
#include<stdio.h>
void DisplayB(char* string)
{
printf("%s\n",string);
}
void DisplayA(char* string)
{
char String[20] = "LoveWorld!";
printf("%s\n",string);
DisplayB(String);
}
int main()
{
char String[20] = "LoveChina!";
DisplayA(String);
return 0;
}
15.2动态管理
15.2.1 malloc函数
void *malloc(unsigned int size)
在stdlib.h头文件中包含该函数,作用是在内存中动态分配一块size大小的内存空间。mallloc函数会返回一个指针,该指针指向分配的内存空间,如果出现错误则返回NULL。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *iIntMalloc = (int*)malloc(sizeof(int)); //分配空间
*iIntMalloc = 100; //使用该空间保存数据
printf("%d\n", *iIntMalloc); //输出数据
return 0;
}
15.2.2 calloc函数
void * calloc(unsigned n,unsigned size);
在stdlib.h头文件中包含该函数,作用是在内存中动态分配n个长度为size的连续内存空间数组。callloc函数会返回一个指针,该指针指向动态分配的连续内存空间地址,当分配空间错误时,返回NULL。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* pArray;
int i;
pArray = (int*)calloc(3, sizeof(int));
for (i = 1;i < 4;i++)
{
*pArray = 10 * i;
printf("NO%d is:%d\n",i,*pArray);
pArray += 1;
}
return 0;
}
15.2.3 realloc函数
void * realloc(void *ptr, size_t size);
在stdlib.h头文件中包含该函数,作用是改变ptr指针指向的空间大小为size大小。设定的size大小可以是任意的,也就是说可大可小。返回值是一个指向新地址的指针,如果出现错误,则返回NULL。
#include<stdio.h>
#include<stdlib.h>
int main()
{
double *fDouble;
int* iInt;
fDouble = (double*)malloc(sizeof(double));
printf("%d\n",sizeof(*fDouble));
iInt = realloc(fDouble, sizeof(int));
printf("%d\n",sizeof(*iInt));
return 0;
}
15.2.4 free函数
void * free(void *ptr);
free函数的功能是释放由指针ptr指向的内存区,使部分内存区还能被其他变量使用。ptr是最近一次调用calloc或malloc函数时的返回值。free函数无返回值。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *pInt; //整型指针
pInt = (int*)malloc(sizeof(pInt)); //分配整型空间
*pInt=100; //赋值
printf("%d\n",*pInt); //将值进行输出
free(pInt); //释放内存空间
printf("%d\n",*pInt); //将值进行输出
return 0;
}
15.3内存丢失
在使用malloc等函数分配过内存后,还需要使用free函数释放内存。内存不进行释放,会造成内存遗漏,甚至可能导致系统崩溃。