![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
csdn_gddf102384398
这个作者很懒,什么都没留下…
展开
-
C语言double比较大小
C语言double比较大小。原创 2023-05-17 14:24:12 · 955 阅读 · 0 评论 -
万能Makefile
INC:=-I ./include #every includePath should add -I CPPS:=$(wildcard src/*.cpp)CS:=$(wildcard src/*.c)BUILD_DIR:=buildTARGET:=$(BUILD_DIR)/mainLIBRARY_PATH:=STATIC_LIBRARY:=SHARED_LIBRARY:=LDFLAGS:= #compile shared library should add -shared flagC.原创 2022-04-28 18:46:22 · 459 阅读 · 0 评论 -
VB.NET调用C语言写的dll中的函数
C语言函数声明:__declspec(dllexport) int __stdcall test1(int a,const char* str);__declspec(dllexport) void __stdcall test2(unsigned char* buf,int len);VB.NET调用C语言函数:'函数声明<DllImport("test.dll", EntryPoint:="test1")>Public Function test1(ByVal a As原创 2021-12-06 21:21:55 · 1206 阅读 · 0 评论 -
C语言可变参数
#include <stdio.h>#include <stdarg.h>//这里的参数c是参数个数int sumi(int c, ...){ va_list argptr; int i; int sum = 0; va_start(argptr, c); //为c个参数初始化argptr for (i=0;i<c;i++) { sum+= va_arg(argptr, int); } va_end(argptr);//清理内存 return s原创 2020-10-15 16:50:43 · 68 阅读 · 0 评论 -
sscanf函数的陷阱
以下代码执行后期望a的值是0x12345678,但是实际执行后a的结果是0x00000078int num = 0;sscanf("12 34 56 78","%02X %02X %02X %02X", (unsigned char*)&num + 3, (unsigned char*)&num + 2, (unsigned char*)&num + 1, (unsigned char*)&num );原因是,sscanf函数接收的参数类型是voi原创 2020-08-31 07:02:14 · 377 阅读 · 0 评论 -
c/c++绝对值函数不要使用abs,应该使用fabs
c/c++绝对值函数不要使用abs,应该使用fabs函数需要包含math.h文件。VC++中使用abs函数需要包含#include <cmath>原创 2020-08-01 11:01:22 · 1264 阅读 · 0 评论 -
C语言产生一个以miu为均值,sigma为均方差的高斯分布的随机变量
#include <stdlib.h>#include <math.h>//产生服从以E为均值,D为方差的高斯分布的随机变量double gaussrand(double E, double D){ double U1, U2; double a, r; double X; //产生两个服从U(0,1)分布的随机变量 U1 = (double)rand() / RAND_MAX; U2 = (double)rand() / RAND_MAX; a = 2原创 2020-07-24 18:00:56 · 1154 阅读 · 3 评论 -
单链表逆置
typedef struct tagNode{ int data; struct Node* next;}Node;void Reverse(Node* pHead){ Node* pReverse = pHead; Node* pCurrent = pHead->next; Node* pFirst = pHead->next; Node* pTail = NULL; Node* pTmp; if (!pHead) return; while (pCurre原创 2020-06-20 10:14:45 · 213 阅读 · 0 评论 -
Linux编译安装libcurl并使用它编写ftp上传的C程序
下载curl-7.70.0.zip并解压在curl-7.70.0的上一级目录编写一个curl_build.sh的文件,内容为:cd curl-7.70.0./configure --prefix=/curl/ --disable-shared --enable-static --without-libidn --without-ssl --without-librtmp --without-gnutls --without-nss --without-libssh2 --without-zlib --原创 2020-05-17 12:27:05 · 301 阅读 · 0 评论 -
C语言转换时间戳为任意格式的字符串
#include <time.h>//例如:1589541757 "%Y/%#m/%#d %#H:%#M:%#S" 对应的是 "2020/5/15 19:22:37"void timeformat(char* buf, int len,char* format, time_t timestamp){ strftime(buf, len, format, localtime(×tamp));}原创 2020-05-15 19:29:38 · 485 阅读 · 0 评论 -
MyUtilityOnWin
MyUtilityOnWin.h#pragma once#include <stdio.h>#include <time.h>#include <windows.h>#define OnlyRead 1 //文件必须存在,若不存在,则返回NULL#define ReadWrite 2 //清空文件内容,若文件不存在就创建#define Appe...原创 2020-01-15 10:04:31 · 177 阅读 · 0 评论 -
C标准文件操作函数封装
#ifndef WrapStdCFile_H#define WrapStdCFile_H#if defined _MSC_VER || defined WIN32#define _CRT_SECURE_NO_WARNINGS#endif#include <stdio.h>size_t Read(FILE* fp, void* readBuf, size_t nByte...原创 2019-12-26 17:03:20 · 725 阅读 · 1 评论 -
使用 Libpng 配合 GDI 完成对 png 图片的解析与显示
转:https://www.cnblogs.com/mr-wid/archive/2013/04/22/3034840.html转载 2019-10-15 10:56:43 · 151 阅读 · 0 评论 -
基于TCP的C/S模式模板(Winsock实现)
服务器程序server.cpp:#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <tchar.h>#include <locale.h>#include <WinSock2.h>#pragma comment(lib,"ws2_32.lib")void ShowS...原创 2018-12-03 22:33:08 · 668 阅读 · 0 评论 -
C语言结构体成员指定存储位数
#include <stdio.h>struct Test{ int a:4; char ch:1;};struct A{ int a; char ch;};int main(){ printf("sizeof(struct Test)=%d\n",sizeof(struct Test)); printf("sizeof(struct A)=%d\n"...原创 2019-06-20 09:32:07 · 1219 阅读 · 0 评论 -
为什么说snprintf比sprintf安全
#include <stdio.h>int main(){ char buf1[6]={0}; sprintf(buf1,"%s","hello world"); printf("%s\n",buf1);//输出:hello world,所以sprintf不安全 char buf2[6]={0}; snprintf(buf2,sizeof(buf2),"%s","hel...原创 2019-06-17 09:03:14 · 228 阅读 · 0 评论 -
VC链接器选项之/MT和/MD的区别
如果一个dll有下面这种函数,则必须使用/MD或/MDd选项链接,不能使用/MT或/MTd://必须使用/MD或/MDd链接选项来生成此模块,不能是/MT或/MTd_declspec(dllexport)int* test(){ return new int[5];}否则,使用此模块的人如果有下述操作,程序运行就会崩溃:int main(){ int* p = test();...原创 2019-06-22 19:26:44 · 1635 阅读 · 0 评论 -
C++数据运算注意事项
#include <stdio.h>int main(){ unsigned char* p; int i1 = 0xFFFFFFFF; p = (unsigned char*)&i1; printf("%X,%X,%X,%X\n", p[0], p[1], p[2], p[3]); float f1 = 0x7FFFFFFF;//f1在内存中不会按照字面值...原创 2019-07-23 11:14:27 · 218 阅读 · 0 评论 -
C语言浮点数的精度
有效数字:从第一个不为0的数开始,之后的所有数都是有效数字1.23090为6个有效数字0.0250为3个有效数字C语言中double只能保留16个有效数字,float只能保留8个有效数字...原创 2019-08-09 10:20:34 · 996 阅读 · 0 评论 -
为什么使用EBP而不用ESP作为访问局部变量的指针的解释、函数调用
EBP默认也使用SS作为段寄存器,C语言函数的形参和局部变量是存储在堆栈中的,并采用EBP作为访问它们的指针。在进入子函数开始,先将EBP压栈以保存其初值,然后将ESP赋给EBP,这样就可以通过EBP进行相对寻址来存取局部变量了。为什么不用ESP呢,因为ESP在程序中可能经常用到,比如通过PUSH和POP成对操作来访问一些临时数据:...push ax;程序执行过程中,需要使用ax保存一些中间...原创 2019-08-25 12:38:09 · 721 阅读 · 0 评论 -
老式风格的C语言语法
//环境:VC++2015#include <stdio.h>//注意这里的x和y不是全局变量add(x, y)int x;int y;{ return(x + y);}main(){ //x=1,y=2;//编译出错,x和y不是全局变量 static b; printf("%d,%d\n",b,sizeof(b));//输出:0,4 printf("%...原创 2019-09-02 11:23:00 · 254 阅读 · 1 评论 -
Win32进程间通信之共享内存
写进程/*写进程*/#include <stdio.h>#include <Windows.h>void main(){ HANDLE hFileMap = CreateFileMappingA(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,1024,"ShareMemTest"); if (hFileMap == N...原创 2019-09-07 14:29:42 · 476 阅读 · 0 评论 -
进程内存布局
x86下Linux典型的进程内存布局C语言中,char* p=“hello”;这里的字符串常量是保存在.rodata段中的,并不是所有的字面值常量都是保存在.rodata中,比如局部变量int a=123; 这里123直接存在于指令中。...原创 2019-09-25 10:14:59 · 100 阅读 · 0 评论 -
Linux下C语言嵌入AT&T汇编
main.c#include <stdio.h>int a;int main(){ asm( "pusha #this is a note\n" "movl $1,a\n" //a is a memory address "movl a,%eax\n" "add $2,%eax\n" "movl %eax,a\n" "popa" ); printf...原创 2019-09-29 19:40:02 · 290 阅读 · 0 评论 -
C语言数据的溢出
unsigned long long num=4102410241024;//得到的结果为num=0,因为这样的整数默认为int类型,在运算阶段4102410241024会发生溢出,结果为0unsigned long long num=410241024*1024ull;//这样就不会溢出了,int会被提升为unsigned long long类型下面代码在linux下的运行结果为:#inc...原创 2019-06-13 16:22:52 · 1036 阅读 · 0 评论 -
I/O的理解
当应用层发起一个读请求时,比如从网卡读数据:recv(s,buf,len,0);这个len仅仅代表buf缓冲区的长度,并不表示此次必须要读到len个字节才返回。当发起recv调用时,recv内部将检查内核缓冲区中是否有数据,如果有,封闭内核缓冲区,然后将内核缓冲区中的数据拷贝至用户缓冲区(即buf),然后离开临界区,以便内核继续向内核缓冲区追加数据,或让其它读函数进入临界区读取数据,然后函数返...原创 2019-04-03 14:59:47 · 460 阅读 · 0 评论 -
实模式与保护模式、C语言程序的内存布局
在实模式中,程序可以自己定义一个段,使SS:SP指向这个段,从而将这个段作为栈来使用,之后的push,pop指令都是在操作这个段。但是在保护模式下,出于安全考虑,操作系统为应用程序安排好了所有的段(包括栈段),程序中的push,pop指令都是操作的由操作系统管理的栈内存,比如函数开始调用时需要入栈,函数调用结束时需要出栈等,这些操作的内存段都是操作系统管理的栈段,也就是说程序无法操作SS这样的段寄...原创 2019-04-03 10:55:53 · 475 阅读 · 0 评论 -
常用算法
#include &lt;stdio.h&gt;//顺序查找1,查找成功返回关键码在数组中的位置,位置从1开始;查找失败返回0。这种方法每次都要判断数组是否越界,效率较低int SeqSearch1(int* pArr,int n,int k){ int i; for (i = 0; i &lt; n; i++) { if (pArr[i] == k) return i +...原创 2019-01-21 10:10:43 · 170 阅读 · 0 评论 -
C语言数据类型转换
//两个字节转换为有符号整数short twobytetoshort(unsigned char a, unsigned char b){ return (a << 8) + b;}//两个字节转换为无符号整数unsigned short twobytetoushort(unsigned char a, unsigned char b){ return (a <...原创 2019-01-12 19:31:14 · 864 阅读 · 0 评论 -
数据解析
对于面向字节流的协议,如串口通信、TCP,数据解析方法简介如下(以串口为例):读取串口: BYTE readBuf[BUF_SIZE]; DWORD dwRead; DWORD dwWantRead = BUF_SIZE; DWORD dwResolveSuccess = 0; while (pctcb->bStartCheck) { dwRead = 0; if...原创 2018-12-29 14:53:48 · 298 阅读 · 0 评论 -
Win32格式化字符串到消息框
int MessageBoxPrintf(TCHAR * szCaption, TCHAR * szFormat, ...){ TCHAR szBuffer[1024]; va_list pArgList; // The va_start macro (defined in STDARG.H) is usually equivalent to: // pArgList = (cha...原创 2018-12-17 10:15:32 · 539 阅读 · 0 评论 -
GetFileSizeEx的用法和printf输出64位的值
LARGE_INTEGER li;GetFileSizeEx(hFile,&li);UINT64 uFileSize = li.QuadPart;printf("%I64u\n", uFileSize);//或直接输出li,对于超过4GB的同样有效原创 2018-12-10 17:37:39 · 1383 阅读 · 0 评论 -
关于套接字的绑定
基于TCP/IP的套接字,由两元组构成,即(IP地址,端口号)无论是在同一进程还是不同进程中,1、两个不同的IP地址可以监听同一端口,构成两个不同的套接字;2、两个相同的IP地址监听不同的端口,构成两个不同的套接字。...原创 2018-12-03 21:08:08 · 1023 阅读 · 0 评论 -
C++拷贝构造函数和运算符重载(VC实现)
String.h文件:#ifndef STRING_H#define STRING_H#include <ostream>using namespace std;class String{public: String(){ m_pStr = nullptr; } String(const char* pStr); String(const String&...原创 2018-12-02 20:47:20 · 208 阅读 · 0 评论 -
C/C++结构体用法及其对齐原则
#include &lt;iostream&gt;using namespace std;/* ①结构体变量的首地址(比如结构体数组就要考虑到结构体本身的地址)能够被其最宽基本类型成员的大小所整除; ②结构体每个成员相对结构体首地址的偏移量(offset)都是该成员大小的整数倍,如有需要编译器会在成员之间加上填充字节; ③结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译...原创 2018-12-02 19:30:57 · 254 阅读 · 0 评论 -
C/C++数组指针、指针数组、函数指针、函数指针数组的用法
#include &amp;amp;lt;iostream&amp;amp;gt;using namespace std;void fun1(int(*pArr)[3], int row){ int i,j; for (i = 0; i &amp;amp;lt; row; i++) { for (j = 0; j &amp;amp;lt; 3; j++) cout &amp;amp;lt;&原创 2018-12-02 19:07:22 · 306 阅读 · 0 评论 -
基于select非阻塞模型的服务端程序示例(Winsock2实现)
/*总结: ①无论阻塞还是非阻塞,select都不会立即返回,select就是用于非阻塞模型中的。 ②将SOCKET置于非阻塞模式下时,处理连接或处理收发数据的Socket API都会立即返回。 ③select会监视fd_set中的所有套接字,一旦有套接字发生IO事件(包括客户端的连接请求),select会立即返回, 并将fd_set中没有发生IO事件的套接字移除。由此可见,如果想让...原创 2018-11-25 19:34:31 · 525 阅读 · 0 评论 -
Windows系统编程
Windows操作系统中,64位程序无法在32位系统中运行,而32位程序可以在64位系统中运行(32位程序的依赖项位于C:\Windows目录或者C:\Windows\SysWOW64目录)。测试当前进程的运行环境: BOOL flag; if (IsWow64Process(GetCurrentProcess(), &flag)) { if (flag) printf(...原创 2019-01-31 13:29:14 · 1581 阅读 · 0 评论 -
网络通信编程
IOCP的介绍:https://www.cnblogs.com/talenth/p/7068392.html进程间通信介绍:https://www.cnblogs.com/findumars/p/6329593.html多线程同步介绍:1、用户模式的多线程同步有:原子操作(Interlocked函数)、临界区CRITICAL_SECTION、条件变量、Slim读写锁等2、内核模式的线程...原创 2019-01-22 11:06:02 · 355 阅读 · 0 评论 -
Linux使用信号量解决线程互斥问题(卖票程序)
/*compile:g++ -D_REENTRANT -lpthread xx.cpp*/#include <stdio.h>#include <pthread.h>#include <unistd.h>#include <semaphore.h>int ticket = 20;sem_t mutex;void* thre...原创 2019-03-28 19:47:17 · 560 阅读 · 0 评论