其实在谭浩强的C语言教程中出现过“stdlib.h”,但是当时自己并未理解内存分配的问题。现在学了汇编语言之后回来看,这些函数还是很容易理解的。
stdlib 头文件里包含了C、C++语言的最常用的系统函数,包括
1函数名称:calloc
函数原型: void calloc(unsigned n,unsigned size);
函数功能: 分配n个 数据项的内存连续空间,每个数据项的大小为size
函数返回: 分配内存单元的起始地址,如果不成功,返回0
2函数名称:free
函数原型: void free(void* p);
函数功能: 释放p所指的内存区
函数返回:
参数说明: p-被释放的 指针
3函数名称:malloc
函数原型: void * malloc(unsigned size);
函数功能: 分配size字节的存储区
函数返回: 所分配的内存区地址,如果内存不够,返回0
4函数名称: realloc
函数原型: void * realloc(void * p,unsigned size);
函数功能: 将p所指出的已分配内存区的大小改为size,size可以比原来分配的空间大或小
函数返回: 返回指向该内存区的 指针.NULL-分配失败
5函数名称: rand
函数原型: int rand(void);
函数功能: 产生0到32767间的随机整数(0到0x7fff之间)
函数返回: 随机整数
6函数名称: abort
函数原型: void abort(void)
函数功能: 异常终止一个进程.
7函数名称: exit
函数原型: void exit(int state)
函数功能: 程序中止执行,返回调用过程
函数返回:
参数说明: state:0-正常中止,非0-非正常中止
8函数名称: getenv
函数原型: char* getenv(const char *name)
函数功能: 返回一个指向 环境变量的 指针
函数返回: 环境变量的定义
参数说明: name-环境字符串
9函数名称: putenv
函数原型: int putenv(const char *name)
函数功能: 将字符串name增加到DOS环境变量中
函数返回: 0:操作成功,-1:操作失败
参数说明: name-环境字符串
10函数名称: labs
函数原型: long labs(long num)
函数功能: 求 长整型参数的 绝对值
函数返回: 绝对值
11函数名称: atof
函数原型: double atof(char *str)
函数功能: 将字符串转换成一个双精度数值
函数返回: 转换后的数值
参数说明: str-待转换 浮点型数的字符串
12函数名称: atoi
函数原型: int atoi(char *str)
函数功能: 将字符串转换成一个整数值
函数返回: 转换后的数值
参数说明: str-待转换为整型数的字符串
13函数名称: atol
函数原型: long atol(char *str)
函数功能: 将字符串转换成一个长整数
函数返回: 转换后的数值
参数说明: str-待转换为 长整型的字符串
14函数名称:ecvt
函数原型: char *ecvt(double value,int ndigit,int *dec,int *sign)
函数功能: 将浮点数转换为字符串
函数返回: 转换后的字符串 指针
参数说明: value-待转换底浮点数,ndigit-转换后的字符串长度
15函数名称:fcvt
函数原型: char *fcvt(double value,int ndigit,int *dec,int *sign)
函数功能: 将浮点数变成一个字符串
函数返回: 转换后字符串 指针
参数说明: value-待转换底浮点数,ndigit-转换后底字符串长度
在字符串处理和申请内存进行发送接收处理时有很大帮助,让我们看看malloc的用法:
int main()
{
char *ram = (char *)malloc ( sizeof(char)* 500000 );
if ( ram==NULL ) {
fprintf ( stderr, "\ndynamic memory allocation failed\n" );
exit (EXIT_FAILURE);
}
uart.init();
/*------------------- FLASH -----------------------------*/
while(1){
if(uart.mode_flag){
xmodem.xmodem_rx();
printf("ram_cnt:%d\n",ram_cnt);
parse_srecord_buf(ram,ram_cnt);
printf("successful!");
ram_cnt = 0;
uart.mode_flag = 0;
}
}
free (ram);
return 0;
}
程序中,用了malloc函数申请了500KB的缓冲单元。可能有人会问,为什么不用栈来处理这个问题呢?这就跟编译有关系了,在编译过程中,系统会将栈需要的空间加到代码中,也就是说如果你在代码中用栈来处理大的数据,那举你编译以后的代码会非常大,你下载到 flash 以后,加载到 sdram 中的时间也会非常之长。而堆则不会,系统对堆的处理方式是何时用何时分配,并不占代码空间。