《C专家编程》之一
一、解决函数返回指针的几种方法
1. 返回一个指向字符串常量的指针。
例子:
char* func()
{
rturn "Only work for simple strings";
}
优点:简单
缺点:如果你需要计算字符串的内容,这种方法就无能为力了。如果以后需要修改返回的字符串,你也会遇到麻烦!
2. 使用全局声明的数组。
例子:
char my_global_array[]; char* func()
{
my_global_array[] = '';
return my_global_array;
}
优点:适用于自己创建的字符串,简单易用。
缺点:任何人都有可能在任何时候修改这个全局数组,而且该函数的下一次调用也会覆盖该数组的内容。
3. 使用静态数组。
例子:
char* func()
{
static char buff[];
buff[] = '';
return buff;
}
优点:可以防止任何人都修改这个数组,只有拥有指向该数组的指针的函数(通过参数传递给它)才能修改这个静态数组。
缺点:但是,该函数的下一次调用将覆盖这个数组的内容,所以调用者必须在此之前使用或备份数组的内容。和全局数据一样,大型缓冲区如果闲置不用是非常浪费内存空间的。
4. 显式地分配一些内存,保存返回的值。
例子:
char* func()
{
char *s = malloc();
...
return s;
}
优点:这个方法具有静态数组的优点,而且在每次调用时都创建一个新的缓冲区,所有该函数以后的调用不会覆盖以前的返回值。它适用于多线程的代码。
缺点:程序员必须承担起内存管理的责任。
5. 要求调用者分配内存类保存函数的返回值。程序员 malloc 和 free
例子:
void func(char* result, int size)
{
...
strncpy(result, "that'd be in the data segment, Bob", size);
} buffer = malloc(size);
func(buffer, size);
...
free(buffer);
优点:内存管理比较轻松。
缺点:程序员还是需要自己管理内存,但是相比起第4种方法而言,malloc和free成对出现,管理内存会更方便。
二、关于声明
2.1 一些不能
1. 函数的返回值不能是一个函数;foo() ()是非法的。
2. 函数的返回值不能是一个数组;foo()[0]是非法的。
3. 数组里面不能有函数;foo[]()是非法的。
三、关于函数参数传递
有些C语言书籍声称“在调用函数时,参数按照从右到左的次序压到堆栈里。”这样的说法过于简单了。其实,参数在传递时首先尽可能地存放到寄存器中(为了追求速度)。
注意:int型变量i和包含一个int型成员的结构(struct)变量s在参数传递时的方式可能完全不同。一个int型变量参数一般会被传递到寄存器中,而结构参数则可能被传递到堆栈中。
四、define和typedef的区别
4.1 其一
define只是文本替换
而typedef却不只是文本替换。typedef是一种彻底的“封装”类型——在声明它之后不能再往里面增加别的东西。如:
#define peach int
unsigned peach i;//No problem.
typedef int banana;
unsigned banana i;//Error.
4.2 其二
在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用#define定义的类型则无法保证。
#define int_ptr int *
int_ptr chalk, cheese; //as int * chalk, cheese; means chalk is a pointer, cheese is int.
typede int* int_ptr;
int_ptr chalk, cheese;//two pointer.
《C专家编程》之一的更多相关文章
- 《Pandoc用户指南》之一
@(编程) 1. 描述 Pandoc是一个用于从一种标记格式转换为另一种的Haskell库,还是一个使用该库的命令行工具.它可以读取markdown格式和Textile格式(的子集).reStruct ...
- Gradle用户指南(1)-Gradle安装
前置条件 Gradle 需要 Java JDK 或者 JRE,版本是 6 及以上.Gradle 将会装载自己的 Groovy 库,因此,Groovy 不需要被安装.任何存在的 Groovy 安装都会被 ...
- Gradle用户指南(章9:Groovy快速入门)
Gradle用户指南(章9:Groovy快速入门) 你可以使用groovy插件来构建groovy项目.这个插件继承了java插件的功能,且扩展了groovy编译.你的项目可以包含groovy代码.ja ...
- Gradle用户指南
下载安装gradle 2.1 下载地址:http://www.gradle.org/learn 安装先决条件:gradle安装需要1.6或者更高版本的jdk(jre)(可以使用java –versio ...
- scons用户指南翻译(附gcc/g++参数详解)
scons用户指南 翻译 http://blog.csdn.net/andyelvis/article/category/948141 官网文档 http://www.scons.org/docume ...
- 阿里云 EDAS-HSF 用户指南
阿里云 EDAS-HSF 用户指南 针对 EDAS v2.3.0©Alibaba EDAS 项目组2015/8/19 1 前言本文档旨在描述阿里云 EDAS 产品中应用服务化模块的基本概念,以及如何使 ...
- 【Flume NG用户指南】(1)设置
作者:周邦涛(Timen) Email:zhoubangtao@gmail.com 转载请注明出处: http://blog.csdn.net/zhoubangtao/article/details ...
- Android官方技术文档翻译——Gradle 插件用户指南(1-3)
不知道是什么网络问题,上午一直发不了博客,其它页面基本正常,就是在写博客这里,每次打开都是响应超时.刚才用了VPN,顺便试了一下,竟然能够编辑.想是CDN之类的问题吧. 这次翻译的是Gradle 插件 ...
- 【Flume NG用户指南】(2)构造
作者:周邦涛(Timen) Email:zhoubangtao@gmail.com 转载请注明出处: http://blog.csdn.net/zhoubangtao/article/details ...
- Android官方技术文档翻译——Gradle 插件用户指南(5)
昨晚把第五章未译完的几句话攻克了.只是第六章没怎么译,明后天又是周末,假设周一前第六章翻译完的话,周一再发第六章. 本文译自Android官方技术文档<Gradle Plugin User Gu ...
随机推荐
- cas sso单点登录系列3_cas-server端配置认证方式实践(数据源+自定义java类认证)
转:http://blog.csdn.net/ae6623/article/details/8851801 本篇将讲解cas-server端的认证方式 1.最简单的认证,用户名和密码一致就登录成功 2 ...
- PHP迭代器
在所有语言中,所有迭代器都必须具有如下4想功能: 1.回滚迭代器到第一个元素 2.潜行到下一个元素 3.获取当前元素 4.验证是否到最后一个元素了 在PHP中我我们可以通过实现iterator来实现迭 ...
- mktime性能问题
#include <time.h> int main() { for (int i = 0; i < 100000; ++i) { struct tm tm = {}; tm.tm_ ...
- ASP.NET中实现页面间数据传递的方法
说到页面间数据传递,很多人都会想到通过像Session这样的全局变量,但是向Session中添加的东西太多会增加服务器的压力,页面间数据传递,数据的作用范围越小越好. ASP.NET页面间数据传递 ...
- 解决Mac上Android开发时adb连接不到手机问题
今天在Mac OS上进行Android开发的时候,打开eclipse连接不到手机MX4问题 1. 插入手机打开 Terminal,输入 system_profiler SPUSBDataType 2 ...
- Bug: freetype/fterrors.h: No such file or directory
Bug描述: 安装PIL过程中出现题目中的错误信息,具体如下:
- MVC中的路由
authour: chenboyi updatetime: 2015-05-02 16:10:04 friendly link: 目录 1,思维导图 2,MVC处理机制简图(讲解路由解析) 3,默 ...
- CentOS 7 安装tomcat
1.下载Linux版的tomcat 2.上传下载tomcat文件到/usr/local中执行以下操作 [root@admin local]# cd /usr/local [root@admin loc ...
- STM8S学习笔记-时钟控制2
今天把时钟系统的最后部分,时钟安全系统(CSS)和时钟输出功能(CCO),做一个简答的说明. 1.时钟安全系统(以下简称CSS) CSS功能很简单,就是监控HSE是否实效(如果系统使用HSE作为主时钟 ...
- 转:PHP - .htaccess设置显示PHP错误
使用.htaccess可以在某种程度上更改PHP的错误显示的设置,实际上,相当于更改PHP.ini的参数,很是方便. 将以下相应代码放到对应目录中的.htaccess文件,即可实现相应功能. 关闭错误 ...