![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
caomiao2006
这个作者很懒,什么都没留下…
展开
-
C语言volatile关键字
1.volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则转载 2014-08-27 23:23:27 · 552 阅读 · 0 评论 -
代码中的当前目录
当前目录指的是运行程序时当前用户所处的目录,而不是程序可执行文件所在的目录。如/home/user/test/debug/目录下有程序test.out,代码中读取配置文件./test.etc。如果在test目录下运行./debug/test.out,则程序会到test目录下去查找test.etc文件,而如果在debug目录下运行./test.out,则程序会到debug目录下去查找test原创 2011-10-25 10:37:40 · 847 阅读 · 0 评论 -
printf格式化输出字符串
main() {printf("%3s,%7.2s,%.4s,%-5.3s\n","CHINA","CHINA","CHINA","CHINA"); }结果怎么是CHINA, CH,CHIN,CHI,%3s,%7.2s,%4s, %-5.3s是什么意思 CHIN转载 2011-10-18 10:56:11 · 5352 阅读 · 0 评论 -
C结构定义的问题
不能像下面的定义:typedef struct _a { int num;} a struct_a;以上定义类似于:typedef char * PCHAR p_c;都是错误的。只能单独定义变量:PCHAR p_c;原创 2011-10-17 17:29:38 · 628 阅读 · 0 评论 -
C语言引用外部变量和函数的区别
同一个工程里面不同模块之间可以互相引用全局变量和函数,但是引用变量必须在引用的模块中用extern进行显示的声明,而引用函数却不必在引用的模块中用extern声明,只需要注意在连接的时候将引用的模块连接到一起。原创 2011-10-17 17:25:49 · 3977 阅读 · 0 评论 -
全局变量和静态全局变量的区别
<br />全局变量和静态全局变量的区别<br /> <br />全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文转载 2011-04-25 17:32:00 · 977 阅读 · 0 评论 -
安装GCC4.6.0的过程
<br /> 1、到ftp://ftp.dti.ad.jp/pub/lang/gcc/下载该版本的gcc源代码包,其实主要用到的是ftp://ftp.dti.ad.jp/pub/lang/gcc/releases/gcc-4.6.0/里面的gcc-4.6.0.tar.bz2包,以及可能需要ftp://ftp.dti.ad.jp/pub/lang/gcc/infrastructure/里面的gmp-4.3.2.tar.bz2、mpc-0.8.1.tar.gz、mpfr-2.4.2.tar.bz转载 2011-04-20 16:38:00 · 6946 阅读 · 0 评论 -
UDP协议下检测主机是否可达的一个方法
<br />3.ICMP的应用--Traceroute(windows是tracert)<br /> Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。前面说到,尽管ping工具也可以进行侦测,但是,因为ip头的限制,ping不能完全的记录下所经过的路由器。所以Traceroute正好就填补了这个缺憾。<br /> Traceroute的原理是非常非常的有意思,它受到目的主机的IP后,首先给目的主机发送一个TTL=1(还记得TTL是什么吗?)的UD原创 2010-09-01 17:15:00 · 3422 阅读 · 0 评论 -
switch case里声明变量的问题
<br />switch(i)<br />{<br /><br />case 0:<br /><br />break;<br /><br />case 1:<br /> int a;<br /> a = 1;<br />break;<br /><br />}<br />以上会编译错误,因为限定这个变量定义和有效区只在该块中有效, 否则你的变量定义理论上说是对整个switch语句而言的, 但是你却定义在某个分支中, 那么其他分支 又看不到, 所以会出错。强制限定变量只在某一个语句块中有效即可解决该问题,即原创 2010-08-27 13:17:00 · 3607 阅读 · 0 评论 -
&&和||的结合性问题
<br />先算&&再算||<br />就和先算乘法再算加法一样<br />可以用括号改变运算顺序原创 2010-08-06 17:55:00 · 1897 阅读 · 0 评论 -
linux 客户端 Socket 非阻塞connect编程(正文)
<br />/*开发过程与源码解析<br />开发测试环境:虚拟机CentOS,windows网络调试助手<br /> 非阻塞模式有3种用途<br /> 1.三次握手同时做其他的处理。connect要花一个往返时间完成,从几毫秒的局域网到几百毫秒或几秒的广域网。这段时间可能有一些其他的处理要执行,比如数据准备,预处理等。<br /> 2.用这种技术建立多个连接。这在web浏览器中很普遍.<br /> 3.由于程序用select等待连接完成,可以设置一个转载 2010-08-02 13:01:00 · 1043 阅读 · 0 评论 -
fread/fwrite第二个参数和第三个参数的区别以及与返回值的关系
两者是块读写的方式,第二个参数是单个块的大小,第三个参数是块的个数,返回值是实际读写的块的个数,而不是字节数。如果将第三个参数设为1,那么如果fread读到的字节数小于第二个参数,则fread返回值为0。这个问题很容易搞错,并导致很多问题,需要强调的是fread函数返回的并不是字节数。realRead = fread(buf,item,count,fp) (每次读item大小转载 2011-10-27 19:46:56 · 6887 阅读 · 0 评论 -
数组的下标访问和指针访问方式效率分析比较
1、int array[10], a;for (a = 0; a { array[a] = 0;}该组使用下标方式赋值,为了对下标表达式求值,编译器在程序中插入指令,取的a的值,并把它与整型的长度(也就是4)相乘,这个乘法需要花费一定的时间和空间2、int array[10], *ap;for (ap = array; ap { *ap =转载 2012-03-28 10:34:11 · 7146 阅读 · 0 评论 -
SO_REUSEADDR的作用
原贴地址:http://topic.csdn.net/u/20090103/16/a0414edb-b289-4c72-84da-39e155e8f4be.html如下演示程序,程序目的是:先准备好一个ServerSocket,监听端口8880,然后建一个ClientSocket(受限于业务需要,必须在ServerSocket准备好后再建Client),也必须绑定同一端口888转载 2012-04-23 15:25:19 · 18639 阅读 · 0 评论 -
#pragma pack(n)对齐用法详解
什么是对齐,以及为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能转载 2013-12-10 17:53:24 · 738 阅读 · 0 评论 -
ascii码表和扩展表
ascii表:ascii扩展表:转载 2013-10-22 10:09:20 · 1157 阅读 · 0 评论 -
strncat和strncpy说明
char *strncat(char *restrict s1, const char *restrict s2, size_t n);如果s2的长度比n小,则完全拷贝s2到s1末尾并以空字符结尾;如果s2的长度比n大,则只拷贝前n个字符到s1,并以空字符结尾。char *strncpy(char *restrict s1, const char *restrict s2, siz原创 2013-10-17 14:29:27 · 1194 阅读 · 0 评论 -
解决logrotate的copytruncate参数导致打开的文件产生空洞
logrotate的copytruncate参数导致打开的文件产生空洞日志文件保存时候使用> 将其保存,对文件进行清除和日志切割(logrotate)时,容易出现文件空洞。需要使用“>>” 可以避免该问题。修改后问题确实解决了。在此Mark一下。同理,在用fopen 打开或创建日志文件时,打开方式使用“w”类似于>,使用"a"类似于>>。如果需要对日志文件进行l转载 2013-10-15 17:08:13 · 8502 阅读 · 1 评论 -
C分割字符串 sscanf vs strtok
sscanfchar buf[]="port=5000";char key[100]="";char value[100]="";sscanf(buf,"%[^=]=%[^\n]",key,value);转载 2012-12-11 19:26:33 · 1153 阅读 · 0 评论 -
socket的相关操作
用setsockopt()来控制recv()与send()的超时在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制:在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的:int nNetTimeout=1000;//1秒,//设置连接和发送超时se原创 2010-08-02 11:59:00 · 1139 阅读 · 0 评论 -
Linux查看文件编码格式及文件编码转换
如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题。Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8。下面介绍一下,在Linux中如何查看文件的编码及如何进行对文件进行编码转换。查看文件编码在Linux中查看文件编码可以通过以下几种方式:1.在Vim中可以直接查看文件编码:set fileencodi转载 2012-05-17 11:32:29 · 590 阅读 · 0 评论 -
ftp检查是否成功的方法
1、检查文件大小是否相同,因为ftp使用tcp协议,tcp自身带有校验功能,一般能保证数据的正确性,传输完成之后,只需要判断文件大小是否和源文件相同,即可基本确认传输是否成功;2、从ftp日志中查找返回码226;3、ftp传输完成之后,会在日志中记录传输的字节数,比较这个数据和源文件的大小;4、对于从服务器get文件的情况,若服务器生成了该文件的MD5值,则可比较下载之后的MD5;转载 2012-05-15 16:53:25 · 6365 阅读 · 0 评论 -
写完文件之后最好调用fflush,否则有可能fclose之后,发现文件的最后有一部分没有写入完整。
如题。原创 2012-05-07 13:55:04 · 7441 阅读 · 2 评论 -
openssl genrsa能够单独生成私钥还能推导出公钥的原因
生成私钥key文件:openssl genrsa -des3 -out tomcat_client.key 1024根据私钥key文件生成公钥:openssl rsa -pubout capub.pem根据key生成csr:openssl req -new -key server.key -out server.csr之所以可以出现上面的用法,原因如下:刚才,在o转载 2012-04-17 18:08:19 · 7560 阅读 · 2 评论 -
(转)C/C++中的日期和时间 time_t与struct tm转换
<br />摘要:<br />本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。<br />关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)<br />1.概念<br />在 C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时原创 2010-08-01 20:54:00 · 903 阅读 · 0 评论 -
ntohs和htons的区别
虽然注册CSDN已经有好几年了,学习写程序也有两年的时间了。对于绝大数人来说,我还是得菜鸟。平时遇到什么问题也会来到这个平台搜索别人的解答。也从这个平台上获益很多。 今天在公司因为一个问题和同事就关于htons与ntohs有没有区别探讨了一下,因为我平时也没留意过,凭着我自己的理解,认为是没有区别的。比如,同在X86的机器下,这两个函数都不是把小端的内存表示方法转成大端的吗。在回来的路上,我想回来查查,同时也想到何不就这个问题写下来,方便自己以后查看,也帮助那些想要解决同样问题的同志呢转载 2010-07-28 19:45:00 · 14706 阅读 · 0 评论 -
fopen打开文件的方式的问题
<br /> 请问大虾们,如何通过fopen以如下方式打开文件:若没有文件则创建文件,若文件存在则保留原来文件的内容,同时又可以从文件头开始读写文件?“w+”的方式会删除原文件,“a+”的方式只能在文件尾操作文件,如何实现以上的打开方式呢?<br /> <br /> 用"a+"的方式打开之后,fseek(fd, 0, SEEK_SET)不行的,因为以这种方式打开之后,用ftell发现文件尾的位置就是0了。<br /> <br /> RE:<br />if( (fp=fopen(原创 2010-06-02 17:50:00 · 1323 阅读 · 0 评论 -
c/c++通过socket发送结构体
c/c++通过socket发送结构可以直接先将结构转化到内存中,再通过send直接发送。 在网络通讯过程中往往涉及一些有关联的参数传递,例如数组,结构体之类的。对于结构体其实方法挺简单,由于结构体对象在内存中分配的空间都是连续的,所以可以将整个结构体直接转化成字符串发送,到了接收方再将这个字符串还原成结构体就大功告成了。 首先,我们建立一个结构体。 stru转载 2010-03-19 11:45:00 · 13267 阅读 · 2 评论 -
c/c++语言中static使用方法
一、c程序存储空间布局 C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变转载 2009-12-04 15:45:00 · 939 阅读 · 0 评论 -
C整型升级和寻常算术转换
ANSI C中的整型升级 char,short int或者int型位段(bit-field),包括它们的有符号或无符号变型, 以及枚举类型,可以使用在需要int或unsigned int的表达式中, 如果int可以完整地表示源类型的所有值,那么该类型的值就转换为int,否则转换为转载 2009-12-04 11:46:00 · 1633 阅读 · 0 评论 -
C++中extern “C”含义深层探索
(转)C++中extern “C”含义深层探索 1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函转载 2009-11-19 16:45:00 · 602 阅读 · 0 评论 -
C语言为什么不做数组下标越界检查
1、为了提高运行效率,不检查数组下表越界,程序就可以跑得快。因为C语言并不是一个快速开发语言,它要求开发人员保证所有逻辑的正确性。所以至少到目前为止,C语言是所有高级语言中速度最快,效率最高的。几乎所有对性能有苛刻要求的场合都使用C语言。 2、不检查下标是为了给程序员更大的空间,也为指针操作带来更多的方便。如果有这个检查的话指针的功能将会大大被削弱,C的数组标识符,里面并原创 2009-11-14 17:18:00 · 3390 阅读 · 0 评论 -
对重复包含的初步认识
#include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码:#include "x.h"#include "x.h"显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码。但是下面的代码:#include "a.h"#include "b.h"看上去没什么问题。如果a.h和b.h都包含了一个头文件x.h。那么x.h在此也同样被包含了两次,只不过它的形式转载 2009-11-15 22:47:00 · 1303 阅读 · 0 评论 -
C语言的一些偏僻知识点
1、C语言是一种自由形式的语言,也就是说并没有规则规定什么地方可以书写语句,一行中可以出现多少条语句,什么地方应该留下空白以及应该出现多少空白等(预处理指令是一个例外,它是以行定位的)。唯一的规则就是相邻的标记之间必须出现一个或多个空白字符,不然他们可能被解释为单个标记。因此下列语句是等价的: y=x+1; y = x + 1; y = x原创 2009-11-15 21:42:00 · 1980 阅读 · 2 评论 -
unsigned和signed比较
测试如下代码: unsigned char ui = -10; char c = -10; char i = 10; if ((unsigned char)c == ui) { printf("%d, %d/n", i, ui); } system("pause"); unsigned类型也可以存放负数,负数在还是右值常数的时候就在计原创 2009-11-12 14:21:00 · 1140 阅读 · 0 评论 -
VS 2005 CRT函数的安全性增强版本
Security-Enhanced Versions of CRT Functions (CRT = C Runtime Library = C运行时间库) 为微软公司对C/C++语言的扩展,其中的一部分已于2003原创 2009-11-04 13:03:00 · 1259 阅读 · 0 评论 -
strcpy/strncpy/strcpy_s比较
strcpy()是依据源串的/0作为结束判断的,不检查copy先的Buffer的Size,如果目标空间不够,就有BufferOverflow问题。请务必使用按照strncpy_s()、strcpy_s()、strncpy()等不同环境而准备的安全度很高的函数。 strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的原创 2009-11-04 11:06:00 · 35145 阅读 · 2 评论 -
sscanf的妙用
可以用如下代码将字符串形式的ip地址转换为四个整数:char * inputIpint ip[4];sscanf_s(inputIp, "%d.%d.%d.%d", &ip[0], &ip[1],&ip[2],&ip[3]); 注意sscanf_s,当读入的类型是整数或其它长度可以确定的类型时,不能在类型后面跟上长度,但是对于字符串类型(char原创 2010-03-25 17:41:00 · 1150 阅读 · 0 评论 -
C/C++动态数组初始化
vs2008里面定义全局变量: extern bool *g_previewStatusArray = new bool[EQUIPMENT_AMOUNT](); //被默认初始化为false 但是如果不加上后面的括号,则默认初始化为true。原创 2010-04-14 16:28:00 · 3408 阅读 · 1 评论 -
C头文件相互包含的问题
在C++中,关于CPP的头文件互相包含的问题很让人头疼,其实我们谁也不愿意弄的结构混乱,难以理解,但有时又是有必须的。 假定当前有两个头文件分别为 A.h 和 B.h,内容分别如下: A.h内容为: #ifndef _A_H_ #define _A_H_ #endif #include "B.h"转载 2010-04-19 16:22:00 · 2902 阅读 · 0 评论