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),是"强整 ...
随机推荐
- 5-13 Rspec实际; validates处理Errors, TDD, 单元测试和验收测试,capybara
validates处理验证错误:详见ActiveModel::Errors文档 一,errors ActiveModel::Errors的实例包含所有的❌.每个错误:key是每个属性的name, va ...
- memcached-1.4.20 主要启动流程笔记
以下笔记主要是关注tcp模式下memcached的启动过程. main() 设置信号处理函数为sig_handler() 初始化系统设置,保存在全局变量settings里面 settings_init ...
- Android出现declaration of org.apache.http.message.BasicLineFormatter appears in /system/framework/
这是由于使用了CloseableHttpClient造成的,把 CloseableHttpClient httpclient = HttpClients.createDefault(); Closea ...
- C++中的this指针
1.关于this指针的一个精典回答: 当你进入一个房子后,你可以看见桌子.椅子.地板等,但是房子你是看不到全貌了.对于一个类的实例来说,你可以看到它的成员函数.成员变量,但是实例本身呢?this是一个 ...
- Largest Point (2015沈阳赛区网络赛水题)
Problem Description Given the sequence A with n integers t1,t2,⋯,tn. Given the integral coefficients ...
- 使用UTL_SMTP发送中文邮件及使用UTL_TCP从附件服务器获取中文附件
先上最重要的干货 发送邮件正文及主题的时候一定要使用convert重新编码 主题: utl_smtp.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(c ...
- Session的方法getSession() 与 getSession(boolean para)区别
getSession(boolean para)返回当前http会话,如果不存在,则创建一个新的会话getSession() 调用getSession(true)的简化版 [官方解释] getSess ...
- sql server2008 如何获取上月、上周、昨天、今天、本周、本月的查询周期(通过存储过程)
我这边有一个需求要统计订单数据,需要统计订单的上传日期,统计的模块大概是 那么上月.上周.昨天.今天.本周.本月应该是怎样呢? 1.数据分析 因为今天是动态数据,我要查月份(上月.本月),应该是一个日 ...
- URAL 1941
比赛的时候三个点没有优化成功.其实也没有想到哈希成数.然后就变成了只要一个长度和scary相等的区间内所有数字个数都是相等的.那么就是符合题意的.于是.为了不TLE我们不能对txt每个位置遍历 的同时 ...
- apscheduler -定时任务
https://apscheduler.readthedocs.io/en/latest/userguide.html 简单的使用方式为: from apscheduler.schedulers.bl ...