c
翠屏阿姨
这个作者很懒,什么都没留下…
展开
-
指针作为函数参数的讨论
今天面试第一题是这样的:#include #include #include char* GetPtr(char* p){ p = (char*)malloc(20); strcpy(p,"string2"); return p; }int main(int argc,char** argv){ char* p1 = "string1"; c原创 2012-05-21 23:15:32 · 852 阅读 · 0 评论 -
C字符串函数系列
1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串strncmp(p, p1, n) 比较指定长度字符串 st转载 2014-04-17 10:40:14 · 827 阅读 · 0 评论 -
C语言的观察者模式
/*hdr** Copyright ...** AUTHOR MichaelMa** DATE 4-May-2014** DESCRIPTION implement a mode of observer in C** NOTE may be some bugs原创 2014-05-04 17:21:34 · 2363 阅读 · 1 评论 -
C语言实现结构体继承
#include #include #include #ifndef VIRTUAL#define VIRTUAL#endif#ifndef DELETE#define DELETE(X) do { free(X);X = NULL; } while(0)#endif#define NEW(TYPE,pInstance,SUBTYPE) struct TYPE* pInst原创 2014-05-05 16:33:40 · 4091 阅读 · 0 评论 -
C语言实现状态设计模式
#include #include #include #ifndef VIRTUAL#define VIRTUAL#endif#ifndef DELETE#define DELETE(X) do { free(X);X = NULL; } while(0)#endif#define NEW(TYPE,pInstance,SUBTYPE) struct TYPE* pInst原创 2014-05-09 18:13:23 · 2137 阅读 · 0 评论 -
判断字符串t是否出现在字符串s的末尾
int send_duff(char *to, char *from,int count1 ,int count){ int ret = 0; int n = (count + 7) / 8; from = from + count - 1; to = to + count1 - 1; switch(count % 8) { case 0: do {原创 2014-04-10 10:37:23 · 1067 阅读 · 0 评论 -
dup和dup2
阅读一些C或者C++第三方库开源源码的时候,有些源码中会使用dup和dup2这两个函数,由于在工作中基本上用不到这两个函数,所以它们对阅读源代码提升了一些难度。虽然当时看过相关博文后能理解,不过过了一段时间就又忘了,今天不算总结,就把这两个函数的经典特性给blog出来。先看一下dup和dup2函数的原型:#includeint dup(int fd);int dup2(int fd1,原创 2017-06-06 03:45:08 · 581 阅读 · 0 评论 -
linux动态库so的运用
so文件的运用在C和C++变成中运用的非常广泛,以下博文是我的使用心得。一.so的静态加载在gcc(或者g++)中使用-l 参数在编译器加载so文件。这样的使用场景,应用程序必须要有于so一同发布的h文件,因为h文件就是so的一个符号列表索引,没有了这个h文件,从何谈起调用so中的函数。二.so的动态加载使用dlsym等函数在应用程序运行时加载so文件。由于dlsym等系列原创 2017-06-06 22:40:36 · 632 阅读 · 0 评论 -
C和C++文件混合编译
一个项目中若同时存在.c文件和.cpp文件,该如何编译呢?首先,来看一下编译的一些小知识:1.gcc编译*.c/*.cpp文件依据各自的文件类型各自编译为C型目标文件和C++型目标文件2.g++编译*.c/*.cpp文件,都是编译为C++类型的目标文件3.在第2点基础上,使用g++时,不论是*.c还是*.cpp都将链接std c++库。而gcc是一句各自文件类型链接相应的std c原创 2017-06-07 23:52:24 · 79968 阅读 · 5 评论 -
if_else_switch_case写法
第一段#define FUNCTION_COOUNT 3#define UNDEFINED -1typedef struct { int nFunction_num; int (*pFun)(int* nInput,int* nOutput);}DISPATCH_ITEMS;DISPATCH_ITEMS sDispatcher[FUNCTION_COOUNT];原创 2018-01-24 21:11:36 · 243 阅读 · 0 评论 -
[代码片段]linux设置套接口非阻塞特性
void set_noblocking(int sock){ int opts = fcntl(sock, F_GETFL); if(opts < 0) { perror("fcntl(sock, F_GETFL)"); exit(1); } opts = opts | O_NONBLOCK; if(fcntl...转载 2018-07-24 23:07:08 · 275 阅读 · 0 评论 -
libssh2库的接口设计模式
C语言的项目代码的架构设计很少有书籍介绍到,今天来谈论一下一个通用的软件代码架构模型。项目工程中有include目录和src目录。src目录中的所有文件最终会被生成一个so文件。在部署的时候将这个so文件和include目录中的所有h文件一起发布,这样,当用户程序包含了include目录中的文件后,就能使用其中的API函数了。接着,就以libssh2.h这个文件做说明。这个文件没有包含任何...原创 2019-03-17 12:17:34 · 787 阅读 · 0 评论 -
[代码片段] 打开文件读写
打开文件读int fd = open(pcm_file, O_RDONLY, 0)读文件static ssize_t safe_read(int fd, void *buf, size_t count) { ssize_t result = 0, res; while (count > 0) { if ((res = read(fd, buf, count)) == 0) ...原创 2019-03-21 19:51:10 · 145 阅读 · 0 评论 -
[代码片段] 创建TCP套接字
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <sy...原创 2019-03-25 19:24:30 · 265 阅读 · 0 评论 -
一个逗号引发的血案
噫吁嚱,危乎高哉,细节决定成败#define PN_INFO_LEN 32const char* arrProductInfo[] = { /*product type*/ "ANALOG_GM", "DIGITAL_GM",原创 2014-03-14 17:43:09 · 718 阅读 · 0 评论 -
通过成员变量地址获取结构体地址
Linux中有一个宏#define container_of(ptr,type,member) 实现略实现了通过成员变量地址获取结构体地址的功能。今天我想好好想想这个实现的原理是怎么来的。先定义一个结构体吧typedef struct{ int a; int b; int c;}ABC;再来设计一个函数用来实现功能int main(v原创 2014-02-27 10:33:25 · 5972 阅读 · 1 评论 -
位段的小实验
用位段做了个实验,在此写为文章,以作以后复习使用。typedef struct{ unsigned a1 : 1; unsigned a2 : 1; unsigned a3 : 1; unsigned a4 : 1; unsigned a5 : 1; unsigned a6 : 1; unsigned a7 : 1; unsigned a8 : 1; unsigned原创 2012-06-18 12:05:04 · 755 阅读 · 0 评论 -
菜鸟思维思考 extern关键字
思考前提:VS2005可以说,从来没有真正的用过extern,真正的思考过extern。不过现在不行了,因为要和C语言打真正的交道了。在C工程中,这文件包含的关系处理可谓是一门高深的学问,因为它决定了编译器的执行行进路径。先来看一个纯C小工程。/*a.c*/#include "b.h"void print0(void);int main(int argc,char** argv)原创 2012-07-06 14:57:50 · 799 阅读 · 0 评论 -
封装free函数遇到的问题
做单片机项目的时候,有一个需求要把C库的free函数封装一下,形如MMFree这样的名字,这样就可以在里面添加调试信息以便输出。可是,唉,我想简单了。我这样设计的:void MXFreeP(void* p){ free(p); p = NULL;}int main(int argc,char** argv){ char* p = NULL; p = (char*)mall原创 2013-01-24 00:58:58 · 2063 阅读 · 12 评论 -
阅读《C 风格的内存分配程序》有感
其实说的就是C语言的malloc和free的实现机制,实现算法。在阅读了内存管理内幕(以下文字基于这个链接)这篇文章的前半部分后,深有感觉,这全是重要的思想啊。关键词:内存控制块MCB MCB这东西是一个结构体,具体定义如下struct mem_control_block { int is_available;//这个字段值为0的时候表示还没有被其他程序使用 int size原创 2013-01-25 17:26:37 · 1112 阅读 · 4 评论 -
字节数值倒置
今天在工作中遇到了这个问题:一个无符号数 unsigned char m = 0x55;要把它转成倒置的数字 0xAA.想了好久,应该有什么算法能轻易实现,不过我最终也没想到一步就完成的算法。可惜了。我采用了下面的做法:typedef struct _bit{ unsigned b1 : 1; unsigned b2 : 1; unsigned b3 : 1; unsig原创 2013-04-27 22:05:30 · 1130 阅读 · 2 评论 -
初识字节对齐
今天写程序的时候遇到一个小难题,如何记录下64个设备的有无动作的表示,我想到了节省资源的位域,写下如下的程序(32位PC下)typedef struct{ unsigned f1 : 1; }new_log_t;sizeof(new_log_t) = 4,似乎没有节省资源吗,再试typedef struct{ unsigned f1 : 1;原创 2013-07-17 10:58:50 · 709 阅读 · 0 评论 -
Linux动态共享库与版本控制初记
记录一下,这东西以前一直都不理解,今天按照最简单的方式创建了一下,记录在此。首先创建四个目录src:用于放置源文件lib:用于放置动态库文件include:用于放置头文件bin:用于放置最后的可执行文件现在include目录下创建mytestso.h文件#include #include int GetMax(int a, int b){ if原创 2013-10-18 10:51:16 · 1048 阅读 · 0 评论 -
C语言可变参数设计的理解
曾经看过C语言可变参数函数的设计原理,今天与同事交流的时候居然没有话题,全忘了。赶快记下来。顺便做一些理解。为了使用C可变参数的一整套机制,第一步就是要包含其头文件#include 这样前提工作就做好了,免得当在你自己的可变函数内部定义va_list arg_ptr;报出以下错误error: 'va_list' was not declared in this scope原创 2013-12-03 22:44:52 · 1164 阅读 · 0 评论 -
C语言函数参数入栈的汇编理解
先来看这样一段程序:#include #include #include void print1(int a,int b,int c){ printf("%p\n",&a); printf("%p\n",&b); printf("%p\n",&c);}int main(void){ print1(1,2,3); exit(0);}它的原创 2013-12-04 22:11:51 · 6719 阅读 · 2 评论 -
对for循环做文章的一个小程序
#include #include #include typedef unsigned int U32;typedef unsigned char U8;#if defined(WIN32) || defined(WIN64) #include //windows下MinGW没有这个头文件的话sleep编译会报错 #define sleep(n) Sleep(1000 * (n)原创 2013-12-26 21:53:06 · 850 阅读 · 0 评论 -
一个记不住原因而写的代码片段了
#include #include #include #include #define _CONDITION(X,Y,Z) (X ? Y : Z) #define CONDITION(X,Y,Z) _CONDITION(X,Y,Z)typedef int INT;typedef unsigned char UCHAR;bool g_bArrINT[] = {false,f原创 2013-12-26 20:51:41 · 827 阅读 · 0 评论 -
ELF文件追寻记(一)
记得前段时间写的文章《Linux动态共享库与版本控制初记》留下了一大堆问题,最起码的ELF文件是什么都没有弄清楚,接下来我准备搞几篇文章弄弄这个东西,也算满足我自己的一个小心愿。先来看一个非常简单的C程序吧(m.c)#include int main(int argc,char** argv){ int a = 5; return 0;}因为简单,所以才能最直观原创 2014-01-23 17:05:49 · 931 阅读 · 0 评论 -
fgetc, EOF 及其它
转载的这篇文章针对EOF进行了比较详细的说明,同时使用代码案例来深入描述,值得收藏约定编译器为 gcc2/x86: 所以 char, unsigned char 为 8 位, int 为 32 位请参考 http://bbs.chinaunix.net/forum/23/20031223/229236.html(1) 字节的读取在正常的情况下, getc 以 uns转载 2014-01-28 10:14:10 · 1046 阅读 · 0 评论 -
用#include的文件中的内容给变量赋值
/*** * data.h*/{1, 1},{2, 2},{3, 3},/*** * main.c*/#include <stdio>struct Data { int a; int b;};static g_array[] = {#include "data.h"};int main(int argc, char ** argv){ in...原创 2019-09-27 10:37:58 · 956 阅读 · 2 评论