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

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 *StringString 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语言 内存管理精讲(malloc,calloc,free,relloc使用)

相关文章:

你感兴趣的文章:

标签云: