
C
LevinLin
本博客现只用于学习用,可能会转载他人的知识,若有涉及到您的版权问题,请与我联系。
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑
展开
-
口令文件 getpwent()
#include #include struct passwd *getpwuid(uid_t uid);struct passwd *getpwnam(const char *name); #include #include #include #include struct passwd * getpwnam(const char *name){ struct原创 2012-07-03 17:28:45 · 667 阅读 · 0 评论 -
数组与指针的区别
int a[100];char a[10];char *b="ABCD";a是数组,包含的信息不一样,它包含它所在的内存地址,还有长度,而b只是一个指针,它只是刚好指向了一个字符串的地址而已.因为a是一个数组,所以也不像指针一样,可以自增自减,像++a,a--是错误的,但 a+1,a-1是可以编译通过的.原创 2012-08-31 11:08:55 · 402 阅读 · 0 评论 -
linux 与window下c申请'变长'数组的疑问
在ubuntu下,用C写下int main(){ int N=10; int a[N]; return 0;}编译没问题。但在window下用VS2008测试,出现问题:error C2057: 应输入常量表达式error C2466: 不能分配常量大小为 0 的数组error C2133: “a”: 未知的大小原因:与操作系统无关,与编原创 2012-08-27 13:03:30 · 1343 阅读 · 0 评论 -
memcpy memmove区别和实现
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。memmove的处理措施:(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝(3)当源内存的首地址小于目标内存转载 2012-08-28 16:32:11 · 546 阅读 · 0 评论 -
浮点型数据在内存中存储的表示
浮点型数据在内存中存储的表示实数在内存中以规范化的浮点数存放,包括数符、阶码、尾数。数的精度取决于尾数的尾数。比如32位机上float型为23位(因为规范化数的数码最高位恒为1,不必存储,实际精度为24位,下面会有详解),double型为52位。浮点表示法类似于科学计数法,任一数均可通过改变指数部分,使小数点位置发生移动,如23.45可以写成:2.345*10^1浮点表示的一般形式为:原创 2012-09-06 20:34:23 · 1383 阅读 · 0 评论 -
字符串分离 split
#include #include #include #include //申请二维数组char **new2arr(int v,int h){ char **dest; int i=0; assert(v>0 && h>0); dest=(char **)malloc(sizeof(char*)*v); for(i=0;i<v;++i) {原创 2012-09-10 14:27:36 · 711 阅读 · 0 评论 -
负数的左移与右移
1)负数的右移:负数右移的话,由于要保持它是负数,所以负数的二进制的右边补1。如果一直右移的话,最后就就变成0xFFFFFFFF 即-1如: -4>>1 为-2 ;-4>>2为-12)负数的左移:跟正整数左移一样,右边补0,一直左移的话,最后就是0啦。-2原创 2012-10-03 22:09:08 · 31225 阅读 · 9 评论 -
使用Foo f2();f2.bar();带来的问题
class Foo{ public: Foo() {}; Foo(int a) {}; void bar() {};};int main(){ // this works... Foo foo1(1); foo1.bar(); // this does not... Foo foo2(); foo2.bar(); return原创 2012-09-14 22:27:01 · 750 阅读 · 0 评论 -
定义与声明
C++ 程序通常由许多文件组成。为了让多个文件访问相同的变量,C++ 区分了声明和定义。 变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。 声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用 extern 关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型原创 2012-09-14 22:38:32 · 479 阅读 · 0 评论 -
基数+快速排序
#include #include void pr_arr(int a[],int len){ int i=0; for(i=0;i<len;++i) { printf("%d ",a[i]); } printf("\n");}void swap(unsigned int *a,unsigned int *b){ if(*a !=*b) { *a^=*b; *原创 2012-09-16 21:48:45 · 661 阅读 · 0 评论 -
switch 与 if/else
效率问题:见e文。 For just a few items, the difference is small. If you have many items you should definitely use a switch.If a switch contains more than five items, it's implemented using a lookup table原创 2012-09-22 15:46:43 · 585 阅读 · 0 评论 -
千万不要把 bool 设计成函数参数
我们有很多 Coding Style 或 代码规范。 但这一条可能会经常被我们所遗忘,就是我们 经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性。 不信?我们先来看看下面的代码。当你读到下面的代码,你会觉得这个代码是什么意思?widget->repaint(false);是不要 repaint 吗?还是别的什么意思?看了文档后,我们才知道这个参数是 im转载 2012-11-16 16:31:37 · 1058 阅读 · 1 评论 -
64位int类型用printf输出问题
int main(){ long long i=1; long long j=2; long long k=3; printf("%d,%d,%d\n",i,j,k);}输出结果:1,0,2为什么?内存布局查看一下:(这里以4个字节为一组查看,实际应是一个字节) 0x00000000-> 0x00000001 -------------原创 2013-05-12 21:51:55 · 2257 阅读 · 0 评论 -
数据结构中char[0]的意义
struct MyData { int nLen; char data[0];}; 在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可转载 2013-09-24 22:57:18 · 3398 阅读 · 1 评论 -
时间相关 time() ctime time_t localtime() gettimeofday
1)求 时间差(精确到微秒) int gettimeofday (struct timeval *__restrict __tv,__timezone_ptr_t __tz);#include #include intmain(void){ int i=0; struct timeval tv,tv2; gettimeofday(&tv, NULL); for (i =原创 2012-07-02 11:23:10 · 2869 阅读 · 0 评论 -
++i 与 i++
i++相当于int operation++(int &i){ int tmp=i; ++i; return tmp;}可以C/C++中 printf("%d",i++);与printf("%d",++i); cout<<i++; 与cout << ++i; 看看区别.原创 2012-08-31 10:42:45 · 444 阅读 · 0 评论 -
C里面没有引用么?
在ubuntu下测试引用不成功。原创 2012-08-17 10:40:55 · 997 阅读 · 0 评论 -
字符串转时间(time_t)
#include #include /** * str为日期字符串 * formatStr 为时间对应的格式, * 如2012-07-04 15:33:52对应的格式为%d-%d-%d %d:%d:%d */time_t string2time(const char * str,const char * formatStr){ s原创 2012-07-04 15:40:41 · 4433 阅读 · 0 评论 -
(.text+0xb3a): undefined reference to `clock_gettime'
问题:(.text+0xb3a): undefined reference to `clock_gettime'Diameter/Diameter.o: In function `CTDiameter::doDWR()':Diameter.cpp:(.text+0xb3a): undefined reference to `clock_gettime'Diameter/Diameter原创 2012-07-10 17:20:43 · 2756 阅读 · 0 评论 -
linux C 字符集转换,UTF-8,GB2312
在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。 利用iconv函数族进行编码转换 iconv函数族的头文件是iconv.h,使用前需包含之。 #include iconv函数族有三个函数,原型如下: (1) iconv_t iconv_o转载 2012-07-11 10:10:21 · 1621 阅读 · 0 评论 -
非局部跳转函数 setjmp 和 longjmp
1. 非局部跳转函数 - setjmp 和 longjmp 函数 非局部指的是,这不是由普通C语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧, 返回到当前函数调用路径上的某一个函数中。(简单点基本这样说:goto 语句用于同一个函数内跳转, 而 setjmp 和 longjmp的组合,不但可以实现函数内跳转,还可以实现函数间跳转) 特别注转载 2012-07-13 17:08:25 · 715 阅读 · 0 评论 -
register volatile 修饰符
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。* Procedure for the assignment of structures, */ /* if the C compiler doesn't support this feature */ #ifdef NOSTRUCTASSIGN转载 2012-07-13 16:45:37 · 2633 阅读 · 0 评论 -
static
C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以转载 2012-07-13 15:56:07 · 479 阅读 · 0 评论 -
创建临时文件 tmpnam tmpfile tempnam mkstemp unlink
推荐使用 tmpfile mkstemp#include #include #include #include intmain(void){ FILE *pfile,*pfile2; int fileSize, readSize; char * fileBuff = NULL; char buff[128] = { 0 };/*****原创 2012-07-03 15:51:39 · 2293 阅读 · 0 评论 -
pthread 多线程编程
1、概述多线程程序作为一种多任务、并发的工作方式,有以下的优点: 1) 提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(time consuming)置于一个新的线程,可以避免这种尴尬的情况。 2) 使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目转载 2012-08-02 14:52:51 · 1179 阅读 · 0 评论 -
dup 与 dup2
1. 文件描述符在内核中数据结构 一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2), 0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联,一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看。 下图可以清楚的说明问题: 进程转载 2012-06-14 15:27:02 · 6615 阅读 · 0 评论 -
exit() abort() 区别
exit()函数结束程序,返回一个值给操作系统,告知程序的最后状态。在调用exit()函数之后,控制权会移交给操作系统。 在结束程序之前,exit()函数会调用之前使用atexit()注册过的所有函数,按照LIFO次序调用,关闭所有打开的文件,删除tmpfile()函数建立的所有临时文件。 abort()函数会发出一个SIGABRT信号来终止程序的执行。不会调用之前用atexit()函数注册原创 2012-07-27 17:16:16 · 1339 阅读 · 0 评论 -
undefined reference to 'pthread_create'
pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a。所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,需要链接该库。问题解决如下:在编译中要加 -lpthread参数gcc -o pthread pthread.c -lpthread 如果使用eclipse,原创 2012-07-29 16:41:55 · 440 阅读 · 0 评论 -
pthread_cleanup_push() pthread_cleanup_pop()
void pthread_cleanup_push(void (*rtn)(void *), void *arg);注册一个线程终止时的清理函数 (类似atexit),后注册的先执行。void pthread_cleanup_pop(int execute); 解除注册最近一个注册的线程清理函数,即线程清理函数使用类似栈的压 (push)、弹(pop)方式进行注册和解除;参数 execute原创 2012-07-29 21:27:32 · 770 阅读 · 0 评论 -
perror() strerror() _strerror()
定义函数 void perror(const char *s); perror ("open_port");函数说明 perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。 在库函数中有原创 2012-07-27 13:55:04 · 589 阅读 · 0 评论 -
#define 中 的“#”与“##”
#define 中 的“##”与“#”#include #define test(n) printf("test("#n")=%d\n",val##n)#define a #aint main(){int val3=10;int val8=23;test(3);test(8); }在#define中定义了“#”,“##”两种操作。“#”用来把参数转换成字符串,“##”则用来转载 2013-12-16 19:25:59 · 1058 阅读 · 1 评论