
C/C++
文章平均质量分 61
summer_liuwei
这个作者很懒,什么都没留下…
展开
-
为什么memcpy_s比memcpy安全
void* memcpy( void *dest, const void *src, size_t count );(until C99)void* memcpy( void *restrict dest, const void *restrict src, size_t count );(since C99)errno_t memcpy翻译 2015-12-09 22:53:50 · 18277 阅读 · 0 评论 -
求n的阶乘,使用数组存储结果
利用基本乘法运算思想求n的阶乘,使用数组存放所得结果。利用数组存放结果,可避免大数溢出的问题。#include int main(){ long int n; long int a[250000]; //确保保存最终运算结果的数组足够大 long int digit = 1; //结果的位数 long int temp; //阶乘的任一元素与临时结果的某位的乘积结果 long int i,j,carry;原创 2011-05-05 22:30:00 · 9193 阅读 · 1 评论 -
有了malloc/free为什么还要new/delete?
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内转载 2011-05-24 18:06:00 · 628 阅读 · 0 评论 -
关于"#ifdef __cplusplus" 和 " extern "C" "
<br />看一些程序的时候老是有<br />“#ifdef __cplusplus<br />extern "C" {<br />#endif”的定义,搞搞清楚是怎么回事:<br />Microsoft-Specific Predefined Macros<br />__cplusplus Defined for C++ programs only. <br />意思是说,如果是C++程序,就使用<br />extern "C"{<br />而这个东东,是指在下面的函数不使用的C++的名字修饰,而是用C的转载 2011-04-01 15:31:00 · 592 阅读 · 0 评论 -
返回局部变量的问题
函数返回局部变量,是返回局部变量的值。但指针(或地址)是一种特殊的值,所以返回局部指针变量需要特别注意。正确情况下,作为函数返回值的局部指针,其所指向对象的作用域应该是调用者作用域、全局或静态常量区;指向栈空间对象的指针作为返回值,存在潜在的错误。1. 返回局部值变量int num(void){ inta; returna;}函数返回时,将返回a的副本(值),然后a被注销,所以不存在问题。2. 返回局部指针变量2.1 返回原创 2011-05-15 23:07:00 · 5318 阅读 · 0 评论 -
关于sizeof(空struct和空class)
struct empty_struct{}empty_struct;struct empty_class{}empty_class; 问:sizeof(empty_struct)和sizeof(empty_class)的大小分别是多少?1. Windows平台下,VC6.0编译环境:空结构体C文件中无法编译通过;在CPP文件中,分别输出1、12.Linux下gcc编译 C文件中,sizeof(empty_struct) = 0C++文件中,sizeof(empty_struct) = 1原创 2011-05-10 17:02:00 · 2312 阅读 · 0 评论 -
do{}while(0)的妙用
<br /> MTK中有很多有关do...while(0)的应用,刚开始可能有很多人不太明白为什么使用do...while(0),似乎不加do...while(0),该部分的代码也会只执行一次,其实do...while(0)是出于优化代码考虑的.do...while(0)并不是程序员为了炫耀自己的技术而展示的奇巧淫技,而是有实实在在的功能用途的.兹转载一篇文章共同研究.<br />转自:http://www.cnblogs.com/flying_bat/archive/2008/01/18转载 2011-03-10 20:50:00 · 580 阅读 · 0 评论 -
linux下处理大文件程序的编译参数
为使程序可以处理大文件的能力,在gcc编译时,加入的大文件(大于2G)支持参数-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE。这些参数需用在编译命令中:CXXFLAGS = -static -g -c -I$(INCLUDEDIR) -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64gcc $(CXXFLAGS) $(SOURCEFILE)原创 2011-03-05 17:26:00 · 2207 阅读 · 0 评论 -
libc、glibc与gcc
<br />转http://blog.163.com/dragon_sjl@126/blog/static/100473339201107101517380/<br /> <br />1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。<br />Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译转载 2011-03-05 15:44:00 · 14500 阅读 · 0 评论 -
linux下编译boost
原文出处:http://blog.ehomy.net/archives/148工作平台:Fedora 12获取boost库Linux下官方提供了两个压缩版本:boost_1_43_0.tar.bz2boost_1_43_0.tar.gz找到其中一个Unix/Linux包的直接下载地址,然后输入下列命令sudo wget http://downloads.sourceforge.net/project/boost/boost/1.43.0/boost_1_43_0.tar.gz?use_mirro原创 2011-03-04 20:31:00 · 14799 阅读 · 2 评论 -
memcmp与strcmp函数
一、memcmp含义Compare characters in two buffers.int memcmp( const void* buf1, const void* buf2, size_t count );inline int wmemcmp ( const wchar_t* buf1, const wchar_t* buf2, size_t count);Parameters buf1 : First buffer. buf2 :原创 2010-11-22 21:20:00 · 2212 阅读 · 0 评论 -
神秘的sizeof(union和struct的区别)
union A{ int a[5];char b;double c; };struct B{int n;A a;char c[10]; }sizeof(B) = ?答案:union A: { int a[5]; //20 char b; //1转载 2011-05-07 19:36:00 · 848 阅读 · 0 评论 -
C函数调用时的内存布局
1、I386平台C函数内部的栈分配函数使用栈来保存局部变量,传递函数参数。进入函数时,函数在栈上为函数中的变量统一预留栈空间,将esp减去相应字节数。当函数执行流程途径变量声明语句时,如有需要就调用相应构造函数将变量初始化。当执行流程即将离开声明所在代码块时,以初始化的顺序的相反顺序逐一调用析构函数。当执行流程离开函数体时,将esp加上相应字节数,归还栈空间。为了访问函数变量,必须转载 2012-08-07 21:41:17 · 2632 阅读 · 1 评论 -
大端序与小端序
大端序与小端序http://www.cnblogs.com/graphics/archive/2011/04/22/2010662.html 何为大端序,小端序?简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了。注意字节序是硬件层面的东西,对于软件来说通常是透明的。再说白一点,字转载 2011-05-16 20:27:00 · 1246 阅读 · 0 评论 -
使用二级指针传出参数
使用指针传出参数时,要注意指针所指向的内存是在函数内分配的还是在函数外分配的,以及是不是在堆上分配的。定义一个指针,但是并没有分配指针指向对象所需的内存空间;当函数返回后,此函数栈中的内存会被释放掉,不要让指针指向此函数栈中的内存空间;要指向堆上或此函数外的内存空间。1. 参数传递的原则是:形参传给实参,不能反向传递;2. 一级指针可以在函数内部修改实参指针指向的内容;转载 2012-03-07 13:06:03 · 2566 阅读 · 0 评论 -
字符数组,字符指针,Sizeof总结
1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写 "abc",那么编译器帮你存储的是"abc\0"2."abc"是常量吗?答案是有时是,有时不是。 不是常量的情况:"abc"作为字符数组初始值的时候就不是,如 char str[] = "abc"; 因为定义的是一个字符数组,所以就相当于定义了转载 2012-03-14 12:13:10 · 710 阅读 · 0 评论 -
gdb用法(二) 在Linux下产生并调试core文件
分析核心(core)文件在程序发生崩溃时,有时可能无法直接运行GDB来进行调试。比如程序可能是在另外一台机器上运行的,或者因为程序对时间比较敏感,所以手动跟踪调试会产生 无法接受的延迟等。遇到这些情况,就只能等到程序运行结束后才能判断崩溃的原因了。这时需要用到Linux提供的core dump机制。当程序中出现内存操作错误时,会发生崩溃并产生核心文件。使用GDB可以对产生的核心文件进行转载 2011-11-27 19:51:32 · 821 阅读 · 0 评论 -
gdb用法(一)基本gdb命令
GDB 概述 GDB是GNU开源组织发布的一个强大的UNIX下的程式调试工具。或许,各位比较喜欢那种图像界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图像化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能:1、启动你的程式,能按照你的自定义的需求随心所欲转载 2011-11-27 19:50:22 · 1650 阅读 · 0 评论 -
对象生死劫 - 构造函数和析构函数的异常
转自http://www.cnblogs.com/leadzen/archive/2008/02/12/1067474.html 在设计类时,构造函数和析构函数往往需要十分的小心。平时不太注意构造函数和析构函数抛出异常,但这却会造成内存泄漏等问题。转载李老师的博客,讲的很清楚: 构造函数和析构函数分别管理对象的建立和释放,负责对象的诞生和死亡的过程。当一个对象诞生时,构造函数负转载 2011-11-21 13:09:09 · 754 阅读 · 0 评论 -
出现频率最高的笔试题strcpy写法
题目: 已知strcpy函数的原型是:char * strcpy(char * strDest,const char * strSrc);1.不调用库函数,实现strc转载 2011-05-07 16:55:00 · 719 阅读 · 0 评论 -
奔跑的内存——C语言的陷阱和缺陷
int i, a[10]; for(i = 1; i a[i] = 0; 这个例子的目的是要将a中的每个元素都设置为0,但没有期望的效果。因为for语句中的比较i 被替换成了i ,a中的一个编号为10的并不存在的元素被设置为了0原创 2011-05-13 22:25:00 · 1260 阅读 · 0 评论 -
linux多线程之线程资源的释放
<br /> 一般来说,对一段运行代码进行加锁然后解锁,如下所示:<br /> pthread_mutex_lock(&mutex);<br /> //运行代码;<br /> pthread_mutex_unlock(&mutex);<br /> 如果在运行代码这块发生错误,有异常,导致这个线程异常退出,那么怎么办,pthread_unlock没有得到调用,那么这个锁资源没有解锁。可以用下面的方法修改。<br /> pthread_cleanup_push(pthread_mutex_un原创 2010-11-18 22:16:00 · 1075 阅读 · 0 评论 -
errno多线程安全
一、errno的由来 在C编程中,errno是个不可缺少的变量,特别是在网络编程中。如果你没有用过errno,那只能说明你的程序不够健壮。当然,如果你是WIN32平台的GetLastError(),效果也是一样的。 为什么会使用errno呢?个人认为,这是系统库设计中的一个无奈之举,他更多的是个技巧,而不是架构上的需要。我们观察下函数结构,可以发现,函数的参数返回值只有一个,这个返回值一般可以携带错误信息,比如负数表示错误,而正数表述正确的返回值,比如recv函数。但是对于一些返回指针的函数转载 2010-11-18 19:57:00 · 11953 阅读 · 0 评论 -
信号量函数 semget() semop() semctl() 说明
信号量是一种对多个进程访问共享资源进行控制的机制,其实为了解决互斥共享资源的同步问题而引入的机制。不能单独定义一个信号量,而只能定义一个信号量集,其中包括一组信号量,同一信号量集中的信号量使用同一引用ID,这样设置是为了多个资源或同步操作的需要。与信号量有关的几个系统调用函数:1、信号量集得创建与打开 semget()原型:int semget(key_t key,int转载 2010-04-09 13:15:00 · 1739 阅读 · 0 评论 -
printf按8进制、16进制输出
printf()8进制、16进制输出格式控制: int num = 0x9; /*输出4位8进制的num*/ printf("%04o/n",num); /*输出2位16进制的num*/ printf("%02X",num); 结果: 0011 09原创 2010-04-08 21:43:00 · 107762 阅读 · 1 评论 -
避免同一文件被多次include
为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 一些声明语句转载 2010-04-07 16:43:00 · 707 阅读 · 0 评论 -
strcpy、strcat与'/o'
#include #include #include int main(){ char * s = (char *) malloc(sizeof(char) * 100); *s = /0; //注意1 strcpy(s,"abc"); strcat(s,"ta.txt"); printf("%s/n",s);原创 2010-04-07 15:55:00 · 958 阅读 · 0 评论 -
sizeof与strlen()
一、 sizeof的使用方法 1、用于数据类型,返回数据类型的字节数 sizeof使用形式:sizeof(type) 如sizeof(int)->返回4;sizeof(char)->返回1。 2、用于变量,返回变量所占用的字节数。 sizeof使用形式:sizeof(var_name) 二、strlen()的使用 strlen()函数的返回值原创 2010-04-07 15:15:00 · 443 阅读 · 0 评论 -
C字符串
char *strcpy(char *dest,const char *src)函数说明 strcpy()会将参数src字符串拷贝至参数dest所指的地址。返回值 返回参数dest的字符串起始地址。附加说明 如果参数dest所指的内存空间不够大,可能会造成缓冲溢出(原创 2010-04-06 15:26:00 · 481 阅读 · 0 评论 -
C语言学习深度(转自优快云)
C语言学习深度(转自优快云)字符串 学习时间:1.5W(“W”周,下同) 知识点checklist strlen()函数的返回值是什么类型的? 字符串strlen()的值,是否和他占据的内存空间相同? 你是否知道strcpy函数存在的潜在风险?如何避免? 如果一个字符串没有字符串结束符,而调用str开头的库函数,会发生什么? Strcpy(),strcat(),strcmp(),strnc转载 2010-04-06 09:21:00 · 502 阅读 · 0 评论 -
C/C++的内存机制
一.首先, 在c中分为这几个存储区 1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放 4.专门放字符串常量的地方。- 程序结束释放 5转载 2010-04-11 14:36:00 · 552 阅读 · 0 评论 -
why define size_t ssize_t ?
why define size_t ssize_t ?http://blog.youkuaiyun.com/yuwenliang/archive/2010/01/18/5207491.aspx ssize_t说明Data Type: ssize_t This data type is used to represent the sizes of b转载 2010-04-08 21:15:00 · 1552 阅读 · 0 评论 -
gcc之静态库文件
静态库文件的扩展名一般为.a。编写步骤:⑴编写函数代码: mylib.h, mylib.c⑵编译生成各目标文件 #gcc -o mylib.o -c mylib.c⑶用ar文件对目标文件归档,生成静态库文件#ar -rc libtest.a m原创 2010-01-09 12:00:00 · 1515 阅读 · 0 评论 -
由a+++++b联想到“左值”与“右值”
今天看到一个问题,说a+++++b表示什么含义? 把它放到程序了试了一下。编译错误,提示:自增操作数必须是左值。然后联想到前两天写一个程序,总遇到l-value的麻烦。 上网查了下:简单的说,左值就是可以在=左边,被赋予值的东西;右值则是在=右边,可以赋给别人的东西。所以左值必须是有内存空间的东东;而右值则未必然,可以是变量,也可是常量和某种表达式,只要能提供一个确定的值即可。 知道这原创 2010-04-26 15:59:00 · 1137 阅读 · 0 评论 -
C中struct的对齐分析
转自http://hi.baidu.com/sunkanghome/blog/item/3d0804af55fa4bc57cd92a14.html参考http://hi.baidu.com/lbxthinker/blog/item/b116d9a3ad6cffa4caefd020.htmlVC中下面几个结构体大小分别是多少呢struct MyStruct { double m4;转载 2010-05-10 22:10:00 · 596 阅读 · 0 评论 -
UML符号简介
类图基本符号可拆分为虚线,箭头,实线,空心右三角,实心右三角,空心菱形和实心菱形。由这些基本的图形进行组合构成了类图的基本符号。这里要注意这几个符号的顺序,代表了类与类之间关系的耦合程度。越向右耦合度越高。 其中虚线+箭头是表示即依赖的关系,实线+箭头表示关联的关系,虚线+空心右三角表示implements,实线+空心右三角表示的是泛化,即类的继承关系。实线+空心菱形表示的是聚合的关系,实线+实心菱形则表示组合的关系。 另外一点是在看类图的时候要注意。类图的思想其实也还没有脱离面向转载 2010-12-09 10:52:00 · 1718 阅读 · 0 评论 -
多线程编程之交叉存取
注意在内存交叉存取时,采用同步结构或加约束以保证程序运行正确。交叉存取(Inter-Leaving)是指一种并行操作的内存存取,内存被分为一系列的簇,有多少个簇就叫做几路交叉存取。它的原理类似于RAID0技术。在交叉存取方式中,内存是被分在不同的块中,只要读写操作是要在两个块中进行的,它们就可以同时进行。原创 2010-10-16 12:07:00 · 1443 阅读 · 0 评论 -
typedef的四个用途和两大陷阱
typedef的四个用途和两个陷阱---------------------------------用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量;以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:char *pa, *pb;也可行,但相对来说没有用typ转载 2010-10-10 11:42:00 · 1055 阅读 · 2 评论 -
面试题集锦
http://blog.chinaunix.net/u3/116865/showart_2310114.html微软亚洲技术中心的面试题!!!1.进程和线程的差别。线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源. (4)系统开转载 2010-08-29 22:32:00 · 433 阅读 · 0 评论 -
回调函数
<br />什么是回调函数?<br />简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。<br />为什么要使用回调函数?<br />因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。<br />如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实转载 2010-08-29 22:34:00 · 395 阅读 · 0 评论