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语言 还允许建立动态分配区域,以存放一些临时用的数据,这些数据需要随时开辟,网站空间,不需要的时候试试释放,这些数据是临时存放在一个特别
的自由存储区,成为 堆 区
如:全局变量 内存管理的手动分配单元 静态变量都是存在 堆区