
C语言
文章平均质量分 78
虎皮猫大人王
这个作者很懒,什么都没留下…
展开
-
kmalloc、vmalloc、malloc的区别
简单的说:kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确)kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大内存只有在要被DMA访问的时候才需要物理上连续vmalloc比kmal转载 2012-02-29 17:38:35 · 573 阅读 · 0 评论 -
sscanf函数的高级用法
sscanf函数的高级用法 转载时请注明出处:http://blog.youkuaiyun.com/absurd/ 大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。 1. 常见用法。char str原创 2012-10-29 17:31:36 · 440 阅读 · 0 评论 -
求二进制数中1的个数
对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效大多数的读者都会有这样的反应:这个题目也太简单了吧,解法似乎也相当地单一,不会有太多的曲折分析或者峰回路转之处。那么面试者到底能用这个题目考察我们什么呢?事实上,在编写程序的过程中,根据实际应用的不同,对存储空间或效率的要求也不一样。比如在PC上的程序编写与在嵌入式设备上的程序编写就有很大的差别。我们可以仔细思索原创 2012-10-30 15:03:37 · 502 阅读 · 0 评论 -
C语言的数组可以用变量定义吗?
今天碰到这个问题,因此写了个小程序测试了一下.#include int num = 0;void test(){ char a[num]; printf("%d\n", sizeof(a));}int main(){ num = 10; test(); num = 11; test();}是否正确?运行结果是原创 2012-10-30 17:45:31 · 9256 阅读 · 1 评论 -
ARRAY_SIZE含义
在写驱动时,看到ARRAY_SIZE这个宏,是求设备结构体中设备的个数。 追其实现,在linux/kernel.h中,发现 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) 其中__must_be_array(arr))作用:宏定义防止被误用,比如用在指针而不是数组上。原创 2012-10-31 10:22:27 · 2446 阅读 · 0 评论 -
二维数组定义以及动态分配空间
下面三种定义形式怎么理解?怎么动态分配空间?(1)、int **Ptr; (2)、int *Ptr[ 5 ]; 我更喜欢写成 int* Prt[5]; (3)、int ( *Ptr )[ 5 ];多维数组一向很难,一般都采用一维数组,但是一旦要用到还真是头疼。 闲话少说,这里我就以三个二维数组的比较来展开讨论: (1)、int **Ptr; (2)、int *Ptr原创 2012-10-31 13:32:45 · 896 阅读 · 0 评论 -
内存分配管理---堆 栈的区别与说明
===============================================================一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放 , 若程序员不释放,程序结束时可原创 2012-10-26 10:43:54 · 671 阅读 · 0 评论 -
C/C++ 与汇编混合编程 总结
使用场合:①在C/C++程序中潜入汇编指令②在汇编程序中访问C/C++定义的全局变量③在C/C++程序中调用汇编函数④汇编程序中调用C/C++函数 ① #include void my_strcpy(const char *src, char *dest){char ch;__asm原创 2012-10-26 10:42:08 · 796 阅读 · 0 评论 -
sscanf,sscanf_s及其相关用法
#include 定义函数 int sscanf (const char *str,const char * format,........);函数说明 sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。返回值 成功则返回参数数目,失败则返回-1,错误原因存于errno中原创 2012-11-17 15:21:35 · 429 阅读 · 0 评论 -
dup、dup2介绍
dup与dup2函数介绍----转载dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的 原形如下:#include int dup( int oldfd );int dup2( int oldfd, int targetfd )利用函数dup,我们可以复制一个描述符原创 2012-11-20 10:06:01 · 409 阅读 · 0 评论 -
用 C 语言实现程序的多态性
(From Qzone) 前言:关于多态,关于 C ,C 语言想告诉我们的是:也许我不擅长,但是并不意味着我做不到。 多态 (polymorphism) 一词最初来源于希腊语 polumorphos,含义是具有多种形式或形态的情形。在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。然而在人们的直观感觉中,多态的含义大约等转载 2012-10-15 16:13:51 · 724 阅读 · 0 评论 -
浮点与定点
浮点与定点也是经常是初学者困惑的问题,在选择DSP器件的时候,是采用浮点还是采用定点,如果用定点是16位还是32位?其实这个问题和你的算法所要求的信号的动态范围有关。定点的计算不过是把一个数据当作整数来处理,通常AD采样来的都是整数,这个数相对于真实的模拟信号有一个刻度因子,大家都知道用一个16位的AD去采样一个0到5V的信号,那么AD输出的整数除以2^16再乘以5V就是对应的电压。在原创 2012-09-20 13:59:35 · 908 阅读 · 0 评论 -
关于控制初始化次数的问题
今天在看解码程序ffmpeg的时候发现,初始化接口是这么写的: void avcodec_init(void){ static int initialized = 0; if(initialized != 0) return ; initialized = 1; dsputil_static_init();} initialized原创 2012-09-18 09:29:30 · 616 阅读 · 0 评论 -
标记化结构初始化语法(C语言)
以前在看Linux代码时,就对它的结构体初始化写法感到奇怪,所有的初始化代码都写清了变量名,并且变量名前面还有一个诡异的点。最近学习Linux设备驱动,又遇到了,就查了一下,发现自己的知识果然纰漏不少,此种初始化写法并不是什么特殊的代码风格,而是所谓的C语言标记化结构初始化语法(designated initializer),而且还是一个ISO标准。[cpp] view p转载 2012-05-25 15:22:48 · 485 阅读 · 0 评论 -
C\C++ 获取当前路径
#include #include int main(){ char *buffer; if((buffer = getcwd(NULL, 0)) == NULL) { perror("getcwd error"); } else { printf("%s\n", buffer);原创 2012-06-30 13:18:38 · 1276 阅读 · 0 评论 -
使结构体紧凑对齐:__attribute__ ((packed))
结构体内的成员有时候会为了访问速度的原因,进行一些对齐,像前面的一篇文章写的那样,比如含有一个字节的char和一个整数int的结构体,大小是8,而不是5.有时候,会不需要这种对齐, 比如写一个Bitmap文件的头:这些头信息可以封装在两个结构体中:BITMAPFILEHEADER,BITMAPINFOHEADER,然后才是BMP数据。而这两个结构体中就的防止字节对齐的现象出现,我就犯过这样的原创 2012-07-20 13:42:29 · 2610 阅读 · 0 评论 -
让程序跳转到绝对地址执行
那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?答案:*((void (*)( ))0x100000 ) ( );首先要将0x100000强制转换成函数指针,即:(void (*)())0x100000然后再调用它:*((void (*)())0x100000)();用typedef可以看得更直观些:typedef voi原创 2012-07-20 13:45:50 · 1937 阅读 · 1 评论 -
#define number 0xFull
今天在面试的时候,碰到了这个题目:#define number 0xFull 解释其意思. 当时没明白,直接问了面试我的人,答曰:0xf后的ull是一个类型.翻然醒悟中...原创 2012-07-20 14:25:38 · 2015 阅读 · 1 评论 -
C++/C宏定义中## 连接符与# 符的含义
##连接符与#符##连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#连接符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一个例子。原创 2012-08-30 11:20:12 · 1072 阅读 · 0 评论 -
位域
工作以来,到今天看h.264才看到位域.实在是惭愧.[cpp] view plaincopytypedef unsigned int uint; typedef struct _node { uint year; uint m:4; uint day:5; uint hour:5;原创 2012-08-23 17:09:09 · 439 阅读 · 0 评论 -
C语言结构体的字节对齐
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。例如,下面的结构各成员空间分配情况:struct te转载 2012-08-28 15:41:05 · 687 阅读 · 0 评论 -
__attribute__((packed))详解
1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法。这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的。例如:在TC下:struct my{ char ch; int a;} sizeof(in转载 2012-08-28 15:40:24 · 534 阅读 · 0 评论 -
C语言:stat,fstat和lstat函数
这三个函数的功能是一致的,都用于获取文件相关信息,但应用于不同的文件对象。对于函数中给出pathname参数,stat函数返回与此命名文件有关的信息结构,fstat函数获取已在描述符fields上打开文件的有关信息,lstat函数类似于stat但是当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用文件的信息。第二个参数buf是指针,它指向一个用于保存文件描述信原创 2012-11-20 10:27:40 · 780 阅读 · 0 评论 -
fcntl即F_SETFL,F_GETFL的使用,设置文件的flags
1、获取文件的flags,即open函数的第二个参数: flags = fcntl(fd,F_GETFL,0);2、设置文件的flags: fcntl(fd,F_SETFL,flags);3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞: flags = fcntl(fd,F_GETFL,0); flags |=原创 2012-11-20 11:31:14 · 2230 阅读 · 0 评论 -
getopt使用方式(续)
引言在早期的 UNIX® 中,其命令行环境(当时的唯一用户界面)包含着数十种小的文本处理工具。这些工具非常小,通常可很好地完成一项工作。这些工具通过较长的命令管道链接在一起,前面的程序将其输出传递给下一个程序以作为输入,整个过程由各种命令行选项和参数加以控制。正是 UNIX 的这方面的特征使其成为了极为强大的处理基于本文的数据的环境,而这也是其在公司环境中的最初用途之一。在命令管道的一端输原创 2011-12-29 09:31:32 · 514 阅读 · 0 评论 -
如何学好C语言
转载地址:http://coolshell.cn/articles/4102.html有人在酷壳的留言版上询问下面的问题keep_walker :今天晚上我看到这篇文章。http://programmers.stackexchange.com/questions/62502/small-c-projects我也遇到了和提问的老外一样的问题。。能给像遇到这样烦原创 2013-01-09 13:30:03 · 483 阅读 · 0 评论 -
c函数: strtok和strtok_r
strtok用来截字符串中的前后字符串.strtok可以根据用户所提供的分割符,将一段字符串分割直到遇到"\0".#include #include int main(void){ char input[16] = "abc,d"; char *p; p = strtok(input, ","); if(p) printf("%s\n", p); p = st原创 2013-01-09 15:35:15 · 596 阅读 · 0 评论 -
fflush和fsync的联系和区别
转载地址:http://www.cnblogs.com/fengxu0824/archive/2012/02/24/2366691.htmlfflush是libc.a中提供的方法,fsync是系统提供的系统调用。2.原形fflush接受一个参数FILE *.fflush(FILE *);fsync接受的时一个Int型的文件描述符。原创 2013-01-11 18:04:03 · 6063 阅读 · 0 评论 -
类型转换函数(特此记录)
一、atoi函数(将字符串转换成整型数)相关函数 atof,atol,atrtod,strtol,strtoul表头文件 #include定义函数 int atoi(const char *nptr);函数说明 atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。返回值 返回转换后原创 2013-02-05 11:35:14 · 922 阅读 · 0 评论 -
字符串函数
c语言字符串函数详解 1.void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. 2.void *memmove(void *dest, const void *src, size_t count); 从src复制count字节的字符到dest. 如果src和dest出现原创 2013-02-05 11:38:27 · 417 阅读 · 0 评论 -
memset初始化维数组
最近碰到一个问题.如何初始化二组数组.例如:#include #include static int a[10][10];int main(void){ memset(a, -1, sizeof(a)); printf("%d\n", a[0][0]); printf("%d\n", a[9][9]); printf(原创 2013-03-14 16:47:29 · 918 阅读 · 0 评论 -
##做为宏定义的参数的作用
#define write(Device, Addr, Data) IO_write((unsigned long)(Addr##_Offset), Data, Device)程序有时候会出来类似的方式.很简单:write(Device,host, date);那么这一句的意思就是: IO_write((unsigned long)(host_Offset), Data, De原创 2013-03-22 10:17:29 · 675 阅读 · 0 评论 -
关于(++a)+(++a)
有一段程序#include int main(void){ int a = 0; a = (++a) + (++a); printf("%d\n", a); return 0;}程序运行结果是:4为什么?http://www.cnblogs.com/smwikipedia/articles/1229984.html真是感叹自己水平菜呀.原创 2013-05-09 14:31:00 · 1388 阅读 · 0 评论 -
getopt 使用
getopt被用来解析命令行选项参数。就不用自己写东东处理argv了。#include extern char *optarg; //选项的参数指针 extern int optind, //下一次调用getopt的时,从optind存储的位置处重新开始检查选项。 extern int opterr, //当opterr=0时,get原创 2011-12-29 09:26:49 · 495 阅读 · 0 评论 -
GCC扩展
GCC扩展分类: 内核学习 LinuxC语言2011-12-06 11:3647人阅读 评论(0)收藏举报view plainprint?"font-family: Arial, Verdana, sans-serif; white-space: normal; ">转自候佩优快云博客,地址:http://blog.youkuaiyun.com/mydo/ar原创 2011-12-26 21:11:49 · 906 阅读 · 0 评论 -
深入解析C语言声明
如果说C语言声明很简单的人不是牛人就是还没入门。本文来讲解C语言的声明的一些基本内容,很多内容参考《c专家编程》。首先由一个最简单的问题引入,你知道 int * p[5] 和 int (*p)[5] 的区别在哪里吗?把后面的答案遮到,想想。也许你知道反正一个是含有五个指向整型的指针元素的指针数组,另一个是指向一个拥有5个整型元素的数组的指针,具体呢?int *p[5]是一个含有五个整型指针的数原创 2011-12-26 21:00:09 · 541 阅读 · 0 评论 -
restrict 关键字
restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样原创 2012-12-04 22:53:28 · 500 阅读 · 0 评论 -
C语言嵌入式系统编程-----软件架构篇
模块划分模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了>相对论), C语言模块化程序设计需理解如下概念:(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;(2原创 2012-12-06 09:11:43 · 1669 阅读 · 0 评论 -
如何将字符串复制到数组中
好久没写过关于C语言的东西,今天发一个.使用strcpy原创 2012-12-09 16:21:28 · 2084 阅读 · 0 评论 -
关于结构体和共用体
[cpp] view plaincopy#include union { int i; char x[2]; }a; void main() { a.x[0] = 10; a.x[1] = 1; printf("%d",a.i); } 答案:266 x86的机器,小端字节原创 2012-12-24 15:22:34 · 476 阅读 · 0 评论