原文链接:http://www.orlion.ga/977/

一、数值字符串转换函数

#include <stdlib.h>
int atoi(const char *nptr);
double atof(const char *nptr);
返回值:转换结果

atoi把一个字符串开头可以识别成十进制整数的部分转换成int型,例如atoi("   -123abc")返回-123(字符串开头可以有空格)。如果字符串开头没有可识别的整数返回0,而atoi("0abc")也返回0。(atoi("abc123")返回0)atof把一个字符串开头可以识别成浮点数的部分转换成double型,如:atof("31.4 ")返回31.4。atoi与atof都不能检查出错的情况。

#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);
double strtod(const char *nptr, char **endptr);
返回值:转换结果,出错时设置errno

strtol是atoi的增强版,主要体现在这几方面:

(1) 不仅可以识别十进制整数,还可以识别其它进制的整数,取决于base参数,比如strtol("0XDEADbeE~~", NULL, 16)返回0xdeadbee的值,strtol("0777~~", NULL, 8)返回0777的值。

(2)endptr是一个传出参数,函数返回时指向后面未被识别的第一个字符。例如char *pos;strtol("123abc", &pos, 10);,strtol返回123,pos指向字符串中的字母a。如果字符串开头没有可识别的整数,例如char *pos; strtol("ABCabc", &pos, 10);,则strtol返回0,pos指向字符串开头,可以据此判断这种出错的情况,而这是atoi处理不了的。

(3)如果字符串中的整数值超出long int的表示范围(上溢或下溢),则strtol返回它所能表示的最大(或最小)整数,并设置errno为ERANGE,例如strtol("0XDEADbeef~~", NULL,16)返回0x7fffffff并设置errno为ERANGE。

二、内存分配函数

除了使用malloc()可以在堆分配内存外还有其他函数可以:

#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
返回值:成功返回所分配内存空间的首地址,出错返回NULL

calloc的参数很像fread/fwrite的参数,分配nmemb个元素的内存空间,每个元素占size字节,并且calloc负责把这块内存空间用字节0填充,而malloc并不负责把分配的内存空间清零。

有时候用malloc或calloc分配的内存空间使用了一段时间之后需要改变它的大小,一种办法是调用malloc分配一块新的内存空间,把原内存空间中的数据拷到新的内存空间,然后调用free释放原内存空间。使用realloc函数简化了这些步骤,把原内存空间的指针ptr传给realloc,通过参数size指定新的大小(字节数),realloc返回新内存空间的首地址,并释放原内存空间。新内存空间中的数据尽量和原来保持一致,如果size比原来小,则前size个字节不变,后面的数据被截断,如果size比原来大,则原来的数据全部保留,后面长出来的一块内存空间未初始化(realloc不负责清零)。注意,参数ptr要么是NULL,要么必须是先前调用malloc、calloc或realloc返回的指针,不能把任意指针传给realloc要求重新分配内存空间。作为两个特例,如果调用realloc(NULL, size),则相当于调用malloc(size),如果调用realloc(ptr, 0),ptr不是NULL,则相当于调用free(ptr)。

#include <alloca.h>
void *alloca(size_t size);
返回值:返回所分配内存空间的首地址,如果size太大导致栈空间耗尽,结果是未定义的

参数size是请求分配的字节数,alloca函数不是在堆上分配空间,而是在调用者函数的栈帧上分配空间,类似于C99的变长数组,当调用者函数返回时自动释放栈帧,所以不需要free。这个函数不属于C标准库,而是在POSIX标准中定义的。

最新文章

  1. 解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
  2. Analyzer中进行货币转换
  3. AFNetworking+Python+Flask+pyOpenSSL构建iOS HTTPS客户端&amp;服务器端
  4. MIME参考列表
  5. GJM : 【技术干货】给The Lab Renderer for Unity中地形添加阴影
  6. CoreOS Architecture Learning
  7. 【Reporting Services 报表开发】— 表达式
  8. Scala学习——数组/映射/元组
  9. Cracking the coding interview--Q2.1
  10. PrintDocument组件打印
  11. StringUtils工具类常用方法汇总2(截取、去除空白、包含、查询索引)
  12. tkinter 创建登陆注册界面
  13. Redis 常用命令总结
  14. mybatis xml &lt; &gt;
  15. Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
  16. highcharts中数据列点击事件
  17. Docker部署微服务
  18. apache 允许 访问软链接 ( Apache won&#39;t follow symlinks (403 Forbidden) )
  19. linux—文件目录简单介绍
  20. MySQL Bugs: #34354: Feature request: EXPLAIN ALTER TABLE https://bugs.mysql.com/bug.php?id=34354

热门文章

  1. nodejs redis 发布订阅机制封装
  2. oracle表空间简单学习
  3. 学用了QT觉得QT较怪异
  4. bootstrap学习笔记【转】
  5. Linux 升级glibc-2.14 失败 我遇到的问题
  6. redis主从配置及主从切换
  7. 联想昭阳E47外接显示器屏幕由扩展改为复制
  8. (转)Eclipse和MyEclipse安装和使用git(egit)图解笔记
  9. 常用的107条Javascript
  10. 初学后台框架总结篇二——快速了解CI框架