C语言内存精讲pdf,C语言 内存管理精讲(malloc,calloc,free,relloc使用)

calloc可以代替malloc+memset,但是malloc+memset代替不了calloc, calloc大块内存时,如果是从系统分配,就可以免了memset的操作,快很多。 memset可以设任意数,calloc只能设0 calloc表示申请count*size大小的内存 malloc只有一个参数 malloc 函数原型: e

calloc 可以代替 malloc + memset,但是 malloc + memset 代替不了 calloc,

calloc 大块内存时,如果是从系统分配,香港虚拟主机,就可以免了 memset 的操作,快很多。

memset可以设任意数,calloc只能设0

calloc表示申请count*size大小的内存

malloc只有一个参数

malloc

函数原型: extern void *malloc(unsigned int num_bytes);

函数描述: 分配长度为num_bytes字节的内存块

入口参数: num_bytes    内存块的大小(单位为字节)

出口参数: 无(或为空)

返回值:    如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

函数说明    不再使用时一定要记得释放,调用函数free

使用示例:

char *pTemp = NULL;

pTemp = (char *)malloc(10 * sizeof(char));

个人理解:

[1]申请空间大小时,利用sizeof做出计算,这样保证会分配正确数量的内存空间;

[2]malloc返回的内存是没有被初始化的,所以可能包含着任何的随机垃圾,应该在其后马上调用memset函数进行初始化为0的操作;

calloc

函数原型: void *calloc(size_t nelem, size_t elsize);

函数描述: 分配指定长度的内存空间

入口参数: nelem    元素的个数(如为10个char申请空间,则为10)

elsize     元素所占用的字节(如为char申请,则为sizeof(char))

出口参数: 无(或为空)

返回值:    如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

函数说明    不再使用时一定要记得释放,调用函数free

使用示例:

char *str = NULL;

str = calloc(10, sizeof(char));

个人理解:

[1]calloc实际上也只能算作是malloc的一种简单的封装;

[2]它会自动的把动态分配的内存进行清0操作,并且保证了分配数量的正确,所以建议使用。

其他说明:

进程对动态内存的分配请求被认为是不紧迫的。例如,当进程的可执行文件被装入时,进程并不一定立即对所有的代码进行访问。

类似地,当进程调用malloc() 请求动态内存时,并不意味着进程很快就会访问所有获得的内存。

因此一般来说,内核总是尽量推迟给用户态进程动态分配内存。

这里只是简单的做个说明……

------------------------------------------------------------------------------------------------------------

自定义类型

简单的用一个新的类型名代替原有的类型名

typedef int Integer;

int i,j;

Integer k;

//声明结构体

typedef struct{

int month;

int day;

int year;

}Date;                   //用typedef 生命的结构体,原结构体变量变成了一个新的类型了

Date birthday;

Date *p;

//定义数组

typedef int Num[100];

Num a;

//定义指针

typedef char *String

String p,s[10];

//定义返回值为int类型无参数的函数指针

typedef int (*pointer)();

pointer p1,p2;

###

typedef 只是对已经存在的类型制定一个新的类型名,而没有创造新的类型

用typedef声明数组类型 指针类型 结构体类型 共用体类型 枚举类型等

typedef 与 #define 表面上有相似之处

当不同的源文件中用到同一类型的数据时,常用typedef声明一些数据类型,可以吧所有的typedef名称声明单独放在一个头文件中

使用typedef名称有利于程序的通用与移植,有时程序会依赖与硬件的特性,用typedef类型便于移植。

------------------------------------------------------------------------

使用位域定义与结构体相仿

格式:

struct 位域结构名{

类型说明   位域名:位域长度;

}

位域长度不能超过该类型的位数

可以将该类型所占的其他位忽略

可以无位域名,表示填充或者调整位置

例如:

struct sta{

unsigned int  a:4; //占用半个字节 4位

unsigned int :0;    //空域 第一个字节的剩余位全清零

unsigned int b:4;   //占用半个字节 4位

unsigned int c:4;   //占用半个字节 4位

}

>>>>>

|   a       |    空   |

|   b       |     c   |

再例如:

struct stb{

int a:1;    //占用1位

int  :2;     //表示 2个位 不用

int b:3;    //占用3位

int c:2;    //占用2位

}

|   a 1   |   空 2   |   b 3  |   c  2 |      //共占8个位

------------------------------------------------------------------

动态内存管理

非静态的局部变量是分配在内存中的动态存储区,这个存储区是一个称为 栈  的区域

如:int a 存放在栈区

C语言 还允许建立动态分配区域,以存放一些临时用的数据,这些数据需要随时开辟,网站空间,不需要的时候试试释放,这些数据是临时存放在一个特别

的自由存储区,成为 堆 区

如:全局变量 内存管理的手动分配单元  静态变量都是存在 堆区

你可能感兴趣的:(C语言内存精讲pdf)