1. c语言中的整数类型有char, short, int, long等几种, 下面是C语言对每种数据类型长度的规定:
(a). short和long类型的长度不相同
(b). int类型通常同具体机器的物理字长相同
(c). short通常是16bits, int通常是16bits or 32bits每种编译器可以根据硬件的不同自由确定, 但是short和int必须最少是16bits, 而long类型必须最少是32bits, 并且short必须比int和long类型要短。
2. sizeof() 运算符返回的是一种数据类型中所包含的字节数(bytes), AnsiC规定sizeof(char)必须返回1,当sizeof作用于数组时, 返回的是数组中所有成员所占的字节数(注意并不是数组中成员的个数), 当sizeof()作用于结构体和公用体时,返回的不仅仅是数据成员总的字节数, 还包括编译器为了实现字节对其而填充的那些字节。
---------------------------------------------------------------------------------------------------------------------------------------------
C++数据类型长度问题:
一、字节和字长
字节,八位就是一个字节,是固定概念。字长是指计算机一次能处理的二进制数据的长度,是一个非固定的概念。例如,8位计算机的字长为8,即一个字节, 32位计算机的字长位32,即4个字节,同 ......
1. c语言中的整数类型有char, short, int, long等几种, 下面是C语言对每种数据类型长度的规定:
(a). short和long类型的长度不相同
(b). int类型通常同具体机器的物理字长相同
(c). short通常是16bits, int通常是16bits or 32bits每种编译器可以根据硬件的不同自由确定, 但是short和int必须最少是16bits, 而long类型必须最少是32bits, 并且short必须比int和long类型要短。
2. sizeof() 运算符返回的是一种数据类型中所包含的字节数(bytes), AnsiC规定sizeof(char)必须返回1,当sizeof作用于数组时, 返回的是数组中所有成员所占的字节数(注意并不是数组中成员的个数), 当sizeof()作用于结构体和公用体时,返回的不仅仅是数据成员总的字节数, 还包括编译器为了实现字节对其而填充的那些字节。
---------------------------------------------------------------------------------------------------------------------------------------------
C++数据类型长度问题:
一、字节和字长
字节,八位就是一个字节,是固定概念。字长是指计算机一次能处理的二进制数据的长度,是一个非固定的概念。例如,8位计算机的字长为8,即一个字节, 32位计算机的字长位32,即4个字节,同 ......
mmap是linux下的CreateFileMapping,用来映射并同步文件。
这样的话,比如我自定义一种文件格式,把它写入到文件中,现在想修改其中的值,就可以用这个函数,把文件映射到内存中
然后用操作数组的方式,来进行文件的同步。如果不用这个函数就得:
1、定义一个结构体
2、定义结构体数组
3、读取文件(w+)
4、修改文件
5、写回文件
如果用这个函数,就不需要那么麻烦了:
1、定义结构体
2、定义结构体指针
3、打开文件,将文件句柄传递给mmap进行映射,返回的是结构体数组
4、修改并写回
具体的差异体现在回写上。
贴段代码,例子是《linux程序设计 第三版》中给的。
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
typedef struct
{
int integer;
char string[24];
} RECORD;
#define NRECORDS 100
#define FILENAME ("records.dat")
int main()
{
RECORD record, *mapped;
int i,f;
FILE *fp;
fp = fopen(FILENAME,"w+");
if(!fp)
{
perror("opern file error");
return EXIT_FAILURE;
......
mmap是linux下的CreateFileMapping,用来映射并同步文件。
这样的话,比如我自定义一种文件格式,把它写入到文件中,现在想修改其中的值,就可以用这个函数,把文件映射到内存中
然后用操作数组的方式,来进行文件的同步。如果不用这个函数就得:
1、定义一个结构体
2、定义结构体数组
3、读取文件(w+)
4、修改文件
5、写回文件
如果用这个函数,就不需要那么麻烦了:
1、定义结构体
2、定义结构体指针
3、打开文件,将文件句柄传递给mmap进行映射,返回的是结构体数组
4、修改并写回
具体的差异体现在回写上。
贴段代码,例子是《linux程序设计 第三版》中给的。
#include <unistd.h>
#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
typedef struct
{
int integer;
char string[24];
} RECORD;
#define NRECORDS 100
#define FILENAME ("records.dat")
int main()
{
RECORD record, *mapped;
int i,f;
FILE *fp;
fp = fopen(FILENAME,"w+");
if(!fp)
{
perror("opern file error");
return EXIT_FAILURE;
......
题目:编写一个程序,用于处理c/c++源程序,将源程序中的注释部分去掉
输入:c/c++文件名
输出:处理后的程序源文件
程序伪代码如下:
c1,c2:char
tag:int
a:读入一个字符存入c1
if tag==0 //读入字符不是注释
if c1=='/' //可能是注释标记
读入一个字符存入c2
if c2=='*' //为/**/注释的开头
tag = 2
else if c2=='/' //为//注释的开头
tag = 1
else //不是注释标记
将c1, c2保存
else //读入的字符为代码
保存c1
else if tag==1 //读入的是//注释
if c1=='\n' //为注释结束标记
tag=0
else //读入的是/**/注释tag==2
if c1=='*' //可能为注释结束标记
读入一个字符赋给c2
if c2=='/' //是/**/注释结尾
tag=0
else //注释没有结束
no ......
题目:编写一个程序,用于处理c/c++源程序,将源程序中的注释部分去掉
输入:c/c++文件名
输出:处理后的程序源文件
程序伪代码如下:
c1,c2:char
tag:int
a:读入一个字符存入c1
if tag==0 //读入字符不是注释
if c1=='/' //可能是注释标记
读入一个字符存入c2
if c2=='*' //为/**/注释的开头
tag = 2
else if c2=='/' //为//注释的开头
tag = 1
else //不是注释标记
将c1, c2保存
else //读入的字符为代码
保存c1
else if tag==1 //读入的是//注释
if c1=='\n' //为注释结束标记
tag=0
else //读入的是/**/注释tag==2
if c1=='*' //可能为注释结束标记
读入一个字符赋给c2
if c2=='/' //是/**/注释结尾
tag=0
else //注释没有结束
no ......
鉴于在用C语言写一些字符串处理的程序时种种的不便,本人坚信"磨刀不误砍柴功"这个信条,于是在专门
进行了一次磨对C语言的磨刀,写了一些字符串的处理函数, 方便网友使用, 大家有好的解决方法也请告知一下.
我估计有一些C的库中肯定有比我这更好的函数, 但是本人没有找到, 望"行家"告知.
#include <string.h>
/********************************************************
返回字符ch在head字符串中首次出现的位置
********************************************************/
int indexString(char* head, char ch)
{
int i=0;
int flag=0;
while(head[i]!=0)
{
if(head[i] == ch)
{
flag=1;
break;
}
i++;
&nbs ......
周五开会做团队成员codereivew, 有同事提出了一个关于gmtime多线程是否安全的问题, 当时觉得程序Link了VC的多线程库,应该不是问题。还好回头核实了一下,发现了竟是一个潜在的bug。
程序分在application(完成项目特定功能)和framework(可重用的核心功能)两部分,线程的启动由framework完成。 app中使用了gmtime/localtime等C库函数。
gmtime/localtime等C函数是非线程安全的,这个n年前就知道, 也知道在Windows平台上VC有MT版本的runtime library,通过线程的局部存储(TLS)实现了/mt 链接时的线程安全。 然而线程的启动必须通过C运行时库的_beginthreadex, 而不是win32 API CreateThead 。不幸的的是当年framework的实现者貌似不清楚_beginthreadex与CreateThread的区别(BTW, 这个是当年进入第一家公司的一道面试题,所以印象颇为深刻),直接调CreateThread启动了线程。
解决方案调查中,VC CRT竟是没有gmtime_r/localtime_r。
参考资料:
http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/c727ae29-5a7a-42b6-ad0b-f6b21c1180b2
http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2006-02/msg00013.html ......
在FC8中默认安装的有mysql,没有的话可以很方便的安装下。
默认的mysql的include文件目录在/usr/include/mysql
默认的mysql的lib文件夹在/usr/lib/mysql
这两个目录在我们编译时候需要到。
我的测试用的C代码为:
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#define CONN_HOST "localhost"
#define CONN_USER "root"
#define CONN_PASS "123"
#define CONN_DB "test"
int main()
{
MYSQL *conn;
char *server = CONN_HOST;
char *user = CONN_USER;
char *pass = CONN_PADD;
char *database = CONN_DB;
conn = mysql_init(NULL);
if(!mysql_real_connect(conn,server,user,pass,database,0,NULL,0))
{
fprintf(stderr,"%s\n",mysql_error(conn));
exit(1);
}
else
&nb ......
在FC8中默认安装的有mysql,没有的话可以很方便的安装下。
默认的mysql的include文件目录在/usr/include/mysql
默认的mysql的lib文件夹在/usr/lib/mysql
这两个目录在我们编译时候需要到。
我的测试用的C代码为:
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#define CONN_HOST "localhost"
#define CONN_USER "root"
#define CONN_PASS "123"
#define CONN_DB "test"
int main()
{
MYSQL *conn;
char *server = CONN_HOST;
char *user = CONN_USER;
char *pass = CONN_PADD;
char *database = CONN_DB;
conn = mysql_init(NULL);
if(!mysql_real_connect(conn,server,user,pass,database,0,NULL,0))
{
fprintf(stderr,"%s\n",mysql_error(conn));
exit(1);
}
else
&nb ......
在FC8中默认安装的有mysql,没有的话可以很方便的安装下。
默认的mysql的include文件目录在/usr/include/mysql
默认的mysql的lib文件夹在/usr/lib/mysql
这两个目录在我们编译时候需要到。
我的测试用的C代码为:
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#define CONN_HOST "localhost"
#define CONN_USER "root"
#define CONN_PASS "123"
#define CONN_DB "test"
int main()
{
MYSQL *conn;
char *server = CONN_HOST;
char *user = CONN_USER;
char *pass = CONN_PADD;
char *database = CONN_DB;
conn = mysql_init(NULL);
if(!mysql_real_connect(conn,server,user,pass,database,0,NULL,0))
{
fprintf(stderr,"%s\n",mysql_error(conn));
exit(1);
}
else
&nb ......