C语言相关
TODD911
热爱计算机
展开
-
reentrant(可重入)函数与thread safe(线程安全)函数的区别
reentrant函数与是不是多线程无关,如果是reentrant函数,那么要求即使是同一个进程(或线程)同时多次进入该函数时,该函数仍能够正确的运作.该要求还蕴含着,如果是在多线程环境中,不同的两个线程同时进入该函数时,该函数也能够正确的运作.thread safe函数是与多线程有关的,它只是要求不同的两个线程同时对该函数的调用在逻辑上是正确的.从上面的说明可以看出,reen转载 2014-09-10 16:27:27 · 1594 阅读 · 0 评论 -
《c专家编程》笔记--深入理解const char*p,char const*p,char *const p
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 事实上这个概念谁都有,只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。 char * const cp; ( * 读成 pointer to转载 2012-08-27 14:19:59 · 1730 阅读 · 0 评论 -
双指针
对于C语言的参数传递都是值传递,当传递一个指针给函数的时,其实质上还是值传递,除非使用双指针。void swap ( int *a, int *b ){ int c; c = *a; *a = *b; *b = c; } int main(void){ int a,b; a = 1; b = 2原创 2013-03-08 21:48:01 · 2338 阅读 · 0 评论 -
c语言中数组的初始化
c语言中,int a[10] = {0};上面语句执行后,a的内容为:0,0,0,0,0,0,0,0,0,0但是,int a[10] = {1};上面语句一直以为结果是:1,1,1,1,1,1,1,1,1,1。而实际上为1,0,0,0,0,0,0,0,0,0.原创 2013-03-04 16:50:49 · 976 阅读 · 0 评论 -
uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型
在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样的疑问。论坛上就有人问:以*_t结尾的类型是不是都是long型的?在baidu上查一下,才找到答案,这时才发觉原来自己对C掌握的太少。那么_t的意思到底表示什么?具体的官方答案没有找到,不过我觉转载 2013-01-10 15:31:35 · 1488 阅读 · 0 评论 -
typedef struct的问题
当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下,然后看下文说明:typedef struct tagNode{ char *pItem; pNode pNext;} *pNode;答案与分析:1、typedef的最简单使用typedef long byte_4;给已知转载 2013-01-06 09:49:02 · 1519 阅读 · 2 评论 -
c实现输出二维蛇形矩阵
直接上代码:#include #include int main(void){ //用户输入的值,创建n*n的矩阵 int n; //蛇形从1开始计数 int count = 1; //a[x][y],x是二维数组的第一个下标,y是第二个。 //round是蛇形矩阵的第几圈,从0开始。 int x,y,round; scanf("%d",&n); int (*原创 2012-08-30 16:55:49 · 10565 阅读 · 2 评论 -
dup与dup2函数介绍
dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的 原形如下:#include int dup( int oldfd ); int dup2( int oldfd, int targetfd ) 利用函数dup,我们可以复制一个描述符。传给该函数转载 2012-10-11 16:50:35 · 868 阅读 · 0 评论 -
malloc二维数组的2种方法
#include #include int main(){ int **a = malloc(sizeof(int)*3); a[0]= malloc(sizeof(int)*2); a[1]= malloc(sizeof(int)*2); a[2]= malloc(sizeof(int)*2); a[0][0] =1; a[0][1] =2;转载 2012-08-28 13:33:55 · 11356 阅读 · 1 评论 -
GCC编译提示显示乱码
WindowsXP下使用SecureCRT SSH到Linux服务器上使用 gcc 编译程序发现里面带乱码,且多到几乎看不清意思的程度。原来我们的Linux服务器是中文环境,于是改为英文环境,设置方法如下:系统语言设置:[root@localhost pro2]# vi /etc/sysconfig/i18nLANG="en_US.UTF-8"转载 2012-08-23 15:55:15 · 12001 阅读 · 7 评论 -
关于符号扩展
一、短数据类型扩展为长数据类型1、要扩展的短数据类型为有符号数的 进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(即比短数据类型多出的那一部分),保证扩展后的数值大小不变如1:char x=10001001b; short y=x; 则y的值应为11111111 10001001b; 2:char x=00001001b; s转载 2012-10-10 10:20:49 · 2934 阅读 · 0 评论 -
Makefile中VPATH的使用
在书写Makefile的时候,将单独在一个目录中编译软件,以避免生成的中间文件散在源文件中,乱花了眼。vpath(VPATH)可以指定搜索目录。auto tools在编译树中生成Makefile时就使用了vpath命令,来达到前面我们所说的目的。例子,目录结构src file1.cpp file2.cpp Makefilebuild转载 2013-03-27 16:13:45 · 1333 阅读 · 0 评论 -
大端小端(Big- Endian和Little-Endian)
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领 域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正 确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian,下面先 从字节序说起。转载 2012-07-25 15:46:55 · 2463 阅读 · 1 评论 -
全局变量定义在头文件的相关试验
想在头文件中定义全局变量,测试程序如下:a.hint a = 3;funca.hvoid funca();funca.c#include #include "a.h"void func_a(){ printf("%p,%d\n",&a,a);}funcb.hvoid funcb();funcb.c#include #include "a.h原创 2014-04-13 17:24:41 · 1234 阅读 · 0 评论 -
Linux内核编码规范
这是一个简短的文档,描述了linux内核的首选代码风格。代码风格是因人而异的,而且我不愿意把我的观点强加给任何人,不过这里所讲述的是我必须要维护的代码所遵守的风格,并且我也希望绝大多数其他代码也能遵守这个风格。请在写代码时至少考虑一下本文所述的风格。首先,我建议你打印一份GNU代码规范,然后不要读它。烧了它,这是一个具有重大象征性意义的动作。不管怎样,现在我们开始:第一转载 2014-03-17 09:18:35 · 3836 阅读 · 0 评论 -
linux线程浅析
本文转载于:http://hi.baidu.com/_kouu/item/282b80a933ccc3a829ce9dd9关于linux线程在许多经典的操作系统教科书中, 总是把进程定义为程序的执行实例, 它并不执行什么, 只是维护应用程序所需的各种资源. 而线程则是真正的执行实体. 为了让进程完成一定的工作, 进程必须至少包含一个线程. 如图1.进程所维护的是程序所包含的转载 2014-01-13 10:46:13 · 1126 阅读 · 0 评论 -
不允许调用库函数,也不允许使用任何全局或局部变量编写strlen函数
不允许调用库函数,也不允许使用任何全局或局部变量编写strlen函数。这是一道面试题,可以使用递归的方式解答,答案如下:#include int mylen(char* p){ if(*p == '\0'){ return 0; } return 1 + mylen(p+1);}int mai原创 2013-10-31 16:20:09 · 2147 阅读 · 0 评论 -
C语言中 float double在内存中的存储
本文转载于:http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgXnSlpof5pKKJbjScy1StbVdiUWARuAYUIYiyHeTIIhVaz3 C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数转载 2013-11-06 11:35:17 · 11517 阅读 · 0 评论 -
C语言的数组名和对数组名取地址
本文转载于:http://blog.csdn.net/zdcsky123/article/details/6517811相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址。现在又这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地址,就是指针的指针,既二级指针嘛!当然这样的结论是错误的,不然转载 2013-10-31 10:06:59 · 1075 阅读 · 0 评论 -
typedef定义函数类型
本文转载于:http://www.2cto.com/kf/201206/136745.html最近在看posix实时信号时,遇到一处函数是如此定义的:typedef void sigfunc_rt(int, siginfo_t *, void *);在我常规理解里,一般定义一个函数类型都是这样定义的:typedef void (*sighandler_t)(int);si转载 2013-09-12 13:22:02 · 13341 阅读 · 3 评论 -
unix环境高级编程——笔记3(POSIX & XSI)
POSIX 表示可移植操作系统接口(Portable Operating System Interface )。电气和电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE)最初开发 POSIX 标准,是为了提高 UNIX 环境下应用程序的可移植性。然而,POSIX 并不局限于 UNIX。许多其它的操作系统,例如 DEC O转载 2012-06-11 21:11:22 · 2122 阅读 · 1 评论 -
二维数组传参的3种方式
方式一:#include #include void display(int a[3][2]){}int main(void){ int a[3][2]; a[0][0] =1; a[0][1] =2; a[1][0] =3; a[1][1] = 4; a[2][0] =5;原创 2012-08-29 08:26:31 · 2955 阅读 · 0 评论 -
setuid函数
setuid(设置真实的用户识别码)相关函数getuid,setreuid,seteuid,setfsuid表头文件#include定义函数int setuid(uid_t uid)函数说明setuid()用来重新设置执行目前进转载 2012-07-11 21:21:58 · 8135 阅读 · 0 评论 -
WIFEXITED/WEXITSTATUS/WIFSIGNALED
If the exit status value (*note ProgramTermination::) of the childprocess is zero, then the status value reported by `waitpid' or `wait'is a转载 2011-07-18 13:37:32 · 1122 阅读 · 0 评论 -
GCC相关
今天编译程序是把参数L和l的作用给忘记了。。。哎,今天一定要写下来,以后再忘记时可以参考(希望不要再忘记): -llibrary 制定编译的时候使用的库 例子用法 gcc -lcurses hello.c 使用ncurses库编译程序 -Ldir 制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然 编译器将只在标准库的目录找。这个dir就是目录的名称原创 2011-06-07 22:04:00 · 567 阅读 · 0 评论 -
GNU Autotools的使用
Linux下,工程管理器 Make 可用于自动编译、链接程序的实用工具。我们要做的是写一个makefile 文件,然后用make命令来编译、链接程序。 Makefile的作用就是让编译器知道要编译一个文件需要依赖其他的哪些文件。这里我们就是要用GNU A转载 2011-07-06 10:07:01 · 755 阅读 · 0 评论 -
信号量
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release S转载 2011-07-01 12:30:00 · 848 阅读 · 0 评论 -
一个简单的多线程 pthread_detach
nclude#include#includevoid print_message_function( void *ptr );main ( ){ pthread_t thread1; while(1) { pthread_create(&thread1,NULL,(void *)&print_m转载 2011-06-28 13:57:00 · 1314 阅读 · 0 评论 -
msync(void *addr,size_t len, int flags) 函数的使用问题
msync(void *addr,size_t len, int flags) 函数使用问题【注意】: 只有在调用了munmap()后或者msync()时,才把内存中的相应内容写回磁盘文件,所写内容仍然不能超过文件的大小。mmap系统调用共享内存1. 解除内存映射函数munmap功能:用来取消参数 【映射的内存地址】所指向的内存起始地址,成功返回0,失败返回-1转载 2011-06-28 13:48:00 · 8616 阅读 · 1 评论 -
int main(int argc,char* argv[])详解
argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,比如: int main(int argc, char* argv[]) { int i; for (i = 0; i cout cin>>i;转载 2011-06-23 10:13:00 · 849 阅读 · 0 评论 -
c函数: strtok 和 strtok_r
函数名: strtok 功 能: 查找由在第二个串中指定的分界符分隔开的单词 用 法: char *strtok(char *str1, char *str2); 程序例: #include #include int main(void)转载 2011-06-16 10:21:00 · 1643 阅读 · 0 评论 -
堆栈中的EIP EBP ESP
EIP,EBP,ESP都是系统的寄存器,里面存的都是些地址。 为什么要说这三个指针,是因为我们系统中栈的实现上离不开他们三个。 我们DC上讲过栈的数据结构,主要有以下特点: 后进先处。(这个强调过多)其实它还有以下两个作用: 1.栈是用来存储临时变量,函数传递的中间结果。 2.操作系统维护的,对于程序员是透明的。我们可能只强调了它的后进先出的特点,至于栈实现转载 2011-06-06 21:51:00 · 905 阅读 · 0 评论 -
C和C++混编,c调用C++,c++调用C
这两天一直在解决这样的一个问题,项目之中有如下的需求: 嵌入式的产品,算法部分用C++实现,而控制程序和其它程序用C实现. 这就要求可以通过C来调用C++的算法程序. 同时,这个项目有一个PC的demo程序,是用VC开发的,这又要求C++能调用C的主控程序. 一直知道应该用extern,但是具体该如何使用,一直也不是很清楚. 首先给出百度来的一些相关的理论: 摘抄一: 1.引言 C++语言的创转载 2011-06-23 10:41:00 · 925 阅读 · 0 评论 -
apue.h头文件的配置
相信很多初学《UNIX环境高级编程》的朋友都会遇到一个问题,运行里面的实例(download:http://www.apuebook.com/)时就出现问题,提示 "错误:apue.h:没有那个文件或目录". apue.h是作者自定义的一个头文件,包括程序所需的常用头文件及出转载 2011-08-02 22:09:55 · 986 阅读 · 0 评论 -
fork函数
一直对fork函数理解不是很深入,如果fork返回的值大于0,则为父进程,如果返回的值为0,则为子进程,那如果是判断之外的语句呢,算子进程还是父进程呢,答案是:都算。详细还是看代码吧。#include "stdio.h"#include "unistd.h"int main(void){ pid_t pid; if((pid = fork())<原创 2012-06-19 21:22:04 · 929 阅读 · 0 评论 -
restrict
restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何转载 2012-06-11 21:21:59 · 743 阅读 · 0 评论 -
通过PID获取进程名
今天项目中要使用PID获取进程的名称,原本以为会有这样的系统调用,但是找了好久都没有找到,所以准备自己写一个,网上查了下资料,发现很多网友都说可以使用遍历/proc$PID的方法来获取进程相关的信息,然后应该有记录进程名的变量,一开始不想使用这种方法,因为觉得要读取文件/proc下面的文件,IO操作效率太低了,后来查了很多资料,发现原来效率不会低,因为/proc都是存放在内存中的,是虚拟的文件系统原创 2012-04-29 08:33:09 · 4712 阅读 · 0 评论 -
Linux信号(signal) 机制分析
【摘要】本文分析了Linux内核对于信号的实现机制和应用层的相关处理。首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理。接着分析了内核对于信号的处理流程包括信号的触发/注册/执行及注销等。最后介绍了应用层的相关处理,主要包括信号处理函数的安装、信号的发送、屏蔽阻塞等,最后给了几个简单的应用实例。 【关键字】软中断信号,signal,sigaction,kil转载 2012-04-12 13:56:27 · 932 阅读 · 0 评论 -
函数返回局部变量(转)
看看下面的程序的输出:#include stdio.h>char *returnStr(){ char *p="hello world!"; return p;}int main(){ char *str; str=returnStr(); printf("%s\n", str);转载 2012-03-16 08:42:41 · 764 阅读 · 0 评论 -
int strncmp ( const char * str1, const char * str2, size_t num );
Compares up to num characters of the C string str1 to those of the C string str2.This function starts comparing the first character of each string. If they are equal to each other, it continues wi翻译 2012-03-14 22:03:21 · 2033 阅读 · 0 评论