C经典案例
1. C中可变参数函数作为函数参数:
- void media_debug_set_handler(struct media_device *media, void (*debug_handler)(void *, ...), void *debug_priv)
- 调用:
- media_debug_set_handler(media, (void (*)(void *, ...))fprintf, stdout);
2.可变参数函数
- gstcaps.c
- GstCaps *gst_caps_new_full (GstStructure * struct1, ...)
- {
- GstCaps *caps;
- va_list var_args;
- va_start (var_args, struct1);
- caps = gst_caps_new_full_valist (struct1, var_args);
- va_end (var_args);
- return caps;
- }
- GstCaps * gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
- {
- GstCaps *caps;
- caps = gst_caps_new_empty ();
- while (structure) {
- gst_caps_append_structure_unchecked (caps, structure);
- structure = va_arg (var_args, GstStructure *);
- }
- return caps;
- }
3.offsetof实现
#include <stddef.h>中 #define offsetof(TYPE, MEMBER) ((int)&((TYPE *)0)->MEMBER)
疑问:为什么自己同样实现报将指针强制类型转换为int,使用头文件中的怎么没有呢 ?
4.C的精髓
- #include <stdio.h>
- #include <stdlib.h>
- void getArray(long *p) {
- int i, j, n = ;
- int *p1 = malloc();
- for (i = ; i < ; i++) {
- for (j = ; j < ; j++) {
- p1[n++] = n;
- }
- }
- *p = (long)p1;
- }
- void printArray(void **p) {
- int i, j;
- int (*p1)[] = (int (*)[])p;
- //int **p1 = (int **)p; //oops,for different deference protocoal
- for (i = ; i < ; i++) {
- for (j = ; j < ; j++) {
- printf("[%d %d]", p1[i][j], *(*(p1+i)+j)); //array pointer also can use ** to deference
- }
- printf("\n");
- }
- }
- int main() {
- int **p = NULL;
- getArray((long *)&p); //三级指针可以强制转换成一级指针进行传参,印证只有值传递
- printArray((void **)p);
- free((void *)p);
- return ;
- }
5.GNU扩展
- int main() {
- int i;
- char a[] = {[ ... ] = };
- for (i = ; i < ; i++) {
- printf("a[%d] = %d\n", i, a[i]);
- }
- return ;
- }
6.errno
errno 是记录系统的最后一次错误代码,错误代码定义在Linux内核的errno-base.h中。errno是一个int型的值,在errno.h中定义。
当linux C api函数发生异常时, 一般会将errno变量(需include errno.h)赋一个整数值, 不同的值表示不同的含义,可以通过查看该
值推测出错的原因。
注意errno记录的是最后一次出错的错误代码,感兴趣的错误代码可能被最新的错误覆盖!
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <string.h>
- #include <errno.h>
- void main()
- {
- printf("errno = %d\n", errno); // errno=0
- // chmod 444 tmp.txt
- int fd = open("tmp.txt", O_RDWR); //此时errno=13: Permission denied
- if (fd < ) {
- // no log.txt
- fd = open("log.txt", O_RDWR);
- printf("error: %s\n", strerror(errno)); //由于log.txt不存在,此处报的是No such file or directory
- }
- }
7. C中左右两边都可以的强制类型转换
- #include <stdio.h>
- #include <stdlib.h>
- void* get_mem(){
- return malloc();
- }
- void main()
- {
- float *p1;
- int *p2, *p3;
- p1 = (float*)get_mem();
- printf("p1=%p\n", p1);
- p3 = (int*)p1; //在右边进行强制类型转换
- *(float**)&p2 = p1; //在左边进行强制类型转换
- printf("p2=%p\n", p2);
- printf("p3=%p\n", p3);
- printf("Hello World\n");
- free(p1);
- }
&p2是一个常量,(float**)指定为地址,解引用为向此常量地址存储空间中写入值,此地址刚好就是p2指针的存储空间。
C经典案例的更多相关文章
- javascript的理解及经典案例
js的简介: JavaScript是一种能让你的网页更加生动活泼的程式语言,也是目前网页中设计中最容易学又最方便的语言. 你可以利用JavaScript轻易的做出亲切的欢迎讯息.漂亮的数字钟.有广告效 ...
- jQuery基础的工厂函数以及定时器的经典案例
1. jQuery的基本信息: 1.1 定义: jQuery是JavaScript的程序库之一,它是JavaScript对象和实用函数的封装, 1.2 作用: 许多使用JavaScript能实现的交 ...
- Linux运维之道(大量经典案例、问题分析,运维案头书,红帽推荐)
Linux运维之道(大量经典案例.问题分析,运维案头书,红帽推荐) 丁明一 编 ISBN 978-7-121-21877-4 2014年1月出版 定价:69.00元 448页 16开 编辑推荐 1 ...
- 经典案例:那些让人赞不绝口的创新 HTML5 网站
在过去的10年里,网页设计师使用 Flash.JavaScript 或其他复杂的软件和技术来创建网站.但现在你可以前所未有的快速.轻松地设计或创造互动的.有趣好看的网站.如何创建?答案是 HTML5 ...
- Altera OpenCL用于计算机领域的13个经典案例(转)
英文出自:Streamcomputing 转自:http://www.csdn.net/article/2013-10-29/2817319-the-application-areas-opencl- ...
- php中foreach()函数与Array数组经典案例讲解
//php中foreach()函数与Array数组经典案例讲解 function getVal($v) { return $v; //可以加任意检查代码,列入要求$v必须是数字,或过滤非法字符串等.} ...
- 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】
阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...
- 经典案例之MouseJack
引言:在昨天的文章<无线键鼠监听与劫持>中,我们提到今天会向您介绍一个无线键鼠的监听与劫持的经典案例,<MouseJack>:MouseJack能利用无线鼠标和键盘存在的一些问 ...
- HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/31513065 上一篇已经实现了这个项目的整体的HTML和CSS: HTML5 C ...
- Wolsey“强整数规划模型”经典案例之一单源固定费用网络流问题
Wolsey“强整数规划模型”经典案例之一单源固定费用网络流问题 阅读本文可以理解什么是“强”整数规划模型. 单源固定费用网络流问题见文献[1]第13.4.1节(p229-231),是"强整 ...
随机推荐
- Python的url解析库--urlparse
一.urlparse解析url的query并构建字典 下面的方法主要的功能: 解析url的各个部分,并能够获取url的query部分,并把query部分构建成dict. 具体的代码实现: >&g ...
- mac外接显示器 双屏同时滑动问题
问题:mac pro 外接一个显示器,用四个手指横向切换屏幕的时候,外接的显示器也一起跟着动了 解决:
- 4-1 contag_tag:返回HTMLtag.
jquery已经过时,做一遍,了解其他知识点. contag_tag(name, content_or_options_with_block = nil, options = nil, &bl ...
- Confluence 6 连接到一个 LDAP 目录
https://www.cwiki.us/display/CONFLUENCEWIKI/Connecting+to+an+LDAP+Directory
- bzoj1834: [ZJOI2010]network 网络扩容 费用流
bzoj1834 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容 ...
- git 下载代码
git clone https://github.com/ContextLogic/Wish-Merchant-API.git wish(wish是下载的地址,这样的话,就在你的住文件夹上)
- TCP文件发送
发送端(客户端) #include <iostream> #include <winsock2.h> #include <Ws2tcpip.h> #include ...
- WEBSERVICE-AXIS2服务端代码
下载axis2的插件 axis2-eclipse-codegen-plugin-1.7.1.zip axis2-eclipse-service-plugin-1.7.1.zip 解压后,将plugin ...
- ZOJ 3829 Known Notation 贪心 难度:0
Known Notation Time Limit: 2 Seconds Memory Limit: 65536 KB Do you know reverse Polish notation ...
- iOS工程中如何去掉第三方的警告
一)第一种方法 在工程中有警告的地方,右键选择Review in log,然后就能看到类似[Wnonnull]这样的警告, 然后在工程buildSettings中的Other Warning Flag ...