C语言
GoingJack
怕什么真理无穷,进一寸有一寸欢喜。
展开
-
【windows】 进程共享内存
前言windows 许多应用程序会在运行的时候创建一些数据,并需要将这些数据传输给其他进程,或者和其他进程共享某块内存。可以使用 CreateFileMapping 并在使用时候第一个参数传入 INVALID_HANDLE_VALUE 。告诉系统创建的文件映射对象的物理存储器不是磁盘上的文件,而是从页交换文件中调拨物理存储器(就是从内存上分配共享内存的意思)。使用例子进程B 向共享内存写数据//写进程#include <iostream>#include <windows.原创 2021-04-17 22:19:55 · 336 阅读 · 0 评论 -
【PE】修改PE .rdata 区块属性 修改程序中只读内存
前言Windows下在C语言编程中我们常常关于字符串的操作一个很简单的代码如图所示。参考 《加密于解密》第十一章内容int main(){ char* str = "helloworld"; str[2] = 'a'; printf("%s\n", str); getchar(); return 0;}我们编译运行程序得到下面的错误:这是因为str字符串所指向的数据是位于 PE文件中的.rdata区块的数据。此区块的数据的默认属性为这个这个程序编原创 2021-04-15 00:07:16 · 867 阅读 · 1 评论 -
【Window内核】UNICODE_STRING常用操作记录
#include <ntddk.h>/**typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; //最多支持 32767字符 PWSTR Buffer; // 不是以零结尾}UNICODE_STRING, *PUNICODE_STRING;typedef struct _STRING { USHORT Length; USHORT MaximumLength; PCHAR Buffer原创 2021-03-17 23:47:55 · 582 阅读 · 0 评论 -
Linux下进程间通讯-管道《一》
开发环境Red Hat Enterprise Linux Server release 7.0 (Maipo)参考书籍《UNIX环境高级编程》 linux下的man帮助手册关于管道知识的编程应用https://blog.csdn.net/qq_42418668/article/details/95187084管道管道是UNIX系统IPC的最古老的形式,并且所有的UNIX...原创 2019-07-09 13:18:11 · 135 阅读 · 0 评论 -
Linux下的关于信号量的总结《二》
关于信号量的基础理论知识请看:https://blog.csdn.net/qq_42418668/article/details/95166917使用信号量和管道实现A进程写内容到管道中,B进程不立刻的读取而是等A进程写完并且退出后B进程才读取。这里的A进程和B进程使用信号量来实现这个效果。我们对semget semop semctl进行封装如下sem.h#ifndef ...原创 2019-07-09 11:21:31 · 403 阅读 · 0 评论 -
Linux下的关于信号量的总结《一》
开发环境Red Hat Enterprise Linux Server release 7.0 (Maipo)参考书籍《Linux高性能服务器编程》关于信号量的应用请看:https://blog.csdn.net/qq_42418668/article/details/95177446问题的提出 当多个进程同时访问系统上的某个资源的时候,比如同时写数据库的某条记录,比...原创 2019-07-09 11:10:18 · 377 阅读 · 0 评论 -
C++编写自己String类
class String{public: String() { _pstr = nullptr; } String(const char *ptr) { if (ptr != nullptr) { _pstr = new char[strlen(ptr) + 1]; strcpy(_pstr, ptr); } else { _pstr...原创 2019-06-03 00:05:58 · 333 阅读 · 0 评论 -
main函数参数获取参数个数,参数列表,环境变量打印出来
int main(int argc,char *argv[],char *envp[]){ printf("参数的个数是(包括第0个当前可执行文件的名字):%d\n",argc); //参数列表 字符串指针 while(*argv) puts(*argv++); //环境变量 while(*envp) ...原创 2019-06-12 20:16:36 · 1714 阅读 · 0 评论 -
Linux下进程间通讯-管道《二》
关于管道基础理论知识:https://blog.csdn.net/qq_42418668/article/details/95184701有名管道的使用编程举例(A进程获取用户的输入写入管道,B进程获取管道的内容并打印到标准输出上面)A.c:/*================================================================* ...原创 2019-07-09 13:35:24 · 153 阅读 · 0 评论 -
Linux下进程间通讯-消息队列《一》
开发环境Red Hat Enterprise Linux Server release 7.0 (Maipo)参考书籍《UNIX环境高级编程》关于消息队列知识的编程应用:https://blog.csdn.net/qq_42418668/article/details/95192660消息队列消息队列时消息的链接表,存放在内核中并由消息队列标识符标识。我们都知道每个...原创 2019-07-09 14:17:27 · 101 阅读 · 0 评论 -
Linux下进程间通讯-消息队列《二》
关于消息队列基础内容:https://blog.csdn.net/qq_42418668/article/details/95189251进程A给消息队列添加消息,进程B获取消息:maina.c:/*================================================================* Copyright (C) 2019 . A...原创 2019-07-09 14:23:58 · 133 阅读 · 0 评论 -
关于mutable,explicit和volatile的解析
mutable修饰普通成员变量,在const常方法中能够修改mutable修饰的普通成员变量。using namespace std;class Test{public: void chageMa(int val) const { ma = val; cout << "ma" << ma << endl; }private:...原创 2019-07-16 17:54:22 · 184 阅读 · 0 评论 -
Linux下网络编程---《一 基础知识》
开发环境Red Hat Enterprise Linux Server release 7.0 (Maipo)参考书籍《Linux高性能服务器编程》学习网络编程(Socket套接口)你所必须知道的知识点1. 关于字节序问题现在CPU的累加器一次都能装载(至少)4字节(32位机下),即一个整数。那么这4字节在内存中排列的顺序将影响它被累加器装载成的整数的值。这就是字节序问题。字节序分为...原创 2019-07-12 15:00:57 · 134 阅读 · 0 评论 -
Linux下网络编程---《二 API接口》
开发环境Red Hat Enterprise Linux Server release 7.0 (Maipo)参考书籍《Linux高性能服务器编程》关于TCP套接口编程的几个API的原型以即主机的事项。以下函数基本上都需要头文件 #include <sys/types.h> #include <sys/socket.h>...原创 2019-07-12 15:23:57 · 332 阅读 · 0 评论 -
Linux下网络编程---《三 使用API接口实现简单的服务器和客户端通讯程序》
程序实现了:服务器接受客户端发送的数据并且打印到屏幕上,并且服务器每次接受完数据后向客户端发送一个"OK"客户端实现接受用户输入(最多128字节)然后发送给服务器,然后接受服务器发来的OK打印到屏幕上面。服务器端:/*================================================================* Copyright (C) ...原创 2019-07-12 15:28:33 · 486 阅读 · 0 评论 -
动态链接
参考书籍:《C专家编程》动态链接地目的:主要目的是:把程序于它们使用的特定的函数库版本中分离开来。取而代之的是,我们约定由系统提供一个接口,该接口保持稳定,不随时间和操作系统的后续版本发生变化。使用动态链接 的优点于不足优点:1,可执行文件的体积可以非常小,更加有效地利用磁盘空间(换句话说它能够节省磁盘空间和虚拟内存,因为函数库只有在被需要时才被映射到进程中。),链接阶段地时间会...原创 2019-08-15 22:10:22 · 134 阅读 · 0 评论 -
vs2017中检测内存泄漏
第一步:定义宏#define CRTDBG_MAP_ALLOC 第二步:头文件#include <crtdbg.h>第三步:在需要检测的地方写入_CrtDumpMemoryLeaks();第四步:查看输出部分(例如下:)char *name = (char*)malloc(100);//没有free掉 _CrtDumpMemoryLeaks();...原创 2019-05-16 12:39:53 · 3544 阅读 · 0 评论 -
使用多线程(或者使用kbhit和查表得方法)用二维数组模拟打字母游戏。
【主要思路和说明】:【附加说明 如果不想使用多线程可以指向看文章最后面的解决问题2的方法】1,使用俩个线程,一个线程用来更新二维数组->把之前在第0行的数据下移一行,在现在的第0行的随机列更新随机字母,清屏后,打印当前二维数组的数据。一个线程用来接受用户的输入,从最后一行往第一行遍历遇到于用户属于相同的字母消除字母(把它的位置的值置为0).2,我定义了11行10列的二维数组,第十...原创 2019-04-28 08:59:31 · 286 阅读 · 0 评论 -
C语言复习巩固知识点_04_内存四区举例&指针字符串逆转
指针逆转字符串:int inverse(char *buf){ if (buf == NULL) { printf("buf==NULL"); return -1; } int length = strlen(buf); char *p1 = buf; char *p2 = buf + length - 1; while (p1 < p2) { ...原创 2019-03-17 02:05:35 · 274 阅读 · 0 评论 -
C语言复习巩固知识点_05_一些关于指针的易错点。
C语言中没有你不知道的,只有你不会调Java语言中没有你不会调的,只有你不知道一级指针易错类型分析1,不要相信主调函数给你传的内存空间void func(int *ptr){ if(ptr==NULL) {printf("ptr error!!!");return ;} ... ...}2,越界问题char arr[3]="...原创 2019-03-17 09:18:51 · 333 阅读 · 0 评论 -
C语言复习巩固知识点_06_Const专题
初级理解:const是定义常量,const意味着只读。含义:int main(){const int a; //int const b; const char *c;char * const d; char buf[100]const char * const e ;return 0;}Int func1(const )//第一个和第二个意思一样,代...原创 2019-03-17 09:43:55 · 296 阅读 · 0 评论 -
C语言复习巩固知识点_07_有一个字符串开头或结尾有n个空格,欲去掉前后空格,返回新字符串
1、有一个字符串开头或结尾含有n个空格(” abcdefgdddd ”),欲去掉前后空格,返回一个新字符串。 要求1:请自己定义一个接口(函数),并实现功能;70分 要求2:编写测试用例。30分 int trimSpace(char *inbuf, char *outbuf);int t...原创 2019-03-17 10:07:34 · 729 阅读 · 0 评论 -
C语言实现strcpy&不定义任何变量实现函数strlen和strcmp
my_strcpy:void my_strcpy(char *dst ,const char *src){ if(NULL==dst||NULL==src)return ; int i=0; while(src[i]!='\0') { dst[i]=src[i++]; } dst[i]='\0';}void my_strc...原创 2019-03-25 19:18:31 · 281 阅读 · 0 评论 -
C语言 挂历的实现
要求:实现一个挂历类似于windows系统如图所示的图片:1,可以显示当前的日期(调用time.h中的函数获取函数的日期);2,可以显示用户给定的具体日期的挂历显示;3,跳转当前显示的下一个月,和上一个月。预备知识: //获取系统时间 //struct tm * gmtime(const time_t *timer);//将日历时间转化为世界标准时间(即...原创 2019-03-19 01:40:39 · 452 阅读 · 0 评论 -
C语言笔记总结汇总_03_C++异常的总结&static 全局变量 局部变量 & 临时变量的常性质
C++异常处理(我感觉概念和断言类似)定义异常是程序在执行期间产生的问题。C++异常是指在程序运行时发生的特殊情况,比如尝试除以0的操作,数组越界,访问文件出错等。异常提供了一种转移程序控制权的方式。C++异常处理涉及三个关键字:try catch throwthrow 当问题出现时,程序会抛出一个异常。这是通过使用throw关键字来完成的。 catch 在您想要处理问题的地方...原创 2019-03-26 13:33:28 · 545 阅读 · 0 评论 -
C语言笔记总结汇总_01_bool&数组&内存四区&全局变量&static&宏
bool类型的量void main(){ bool a = 0; a = -1; printf("%d\n", a); system("pause"); return ;}结果:结论:真有千千万,而假只有一种。(简单来说bool类型的变量只有给它赋值为0它才为0负责都为1)。那么bool flag=随机值 flag的结果是1,因为随机值是非0的值。数组...原创 2019-03-23 15:14:08 · 657 阅读 · 0 评论 -
C语言笔记总结汇总_02_数组和指针
数组一般我们学习只谈论C99标准下的规定,因为其他的标准支持的语法太全了比如C11下 int arr[n]={1,2,3,4,5,6,7,8,9}这个语法是合法的,编译器很智能的将数组的个数赋值给n。。。数组定义时可以指定大小也可以不指定大小。int arr[10]={1,2,3,4,5,6,7,8,9,0};//sizeof(arr)=40=4byte*10个int arr[...原创 2019-03-23 15:38:02 · 185 阅读 · 0 评论 -
C语言结构体-内存对齐原则
补充:可以使用简单地从大到小排列成员,以取得最小地空间浪费(最大成员在先)。——————————————————————原则:1,结构体中的第一个变量的起始地址为0,其余变量的内存其实位置为Min(#pragma pack(n),sizeof(这个变量))的整数倍。2,如果有嵌套结构体,那么只需要将嵌套的结构体当作是普通变量即可。3,最终sizeof 结构体的结果是所有对齐变量...原创 2019-04-12 16:47:31 · 709 阅读 · 0 评论 -
【C语言】int *pr[10]和int (*sr)[10]的区别
解释表达式区别的时候的原则:从右向左解释,先解释括号里边的内容。那么可以得出结论 int *pr[10]是一个指针数组(一个长度为10的数组,数组中的元素的类型是int型的指针)。int (*sr)[10]是一个指向长度为10的数组的指针(指向数组首元素的地址,相当于数组首元素的地址的地址,数组首元素的二级指针)可以尝试下面代码更加深刻的理解其区别。void mai...原创 2019-04-16 14:06:14 · 1071 阅读 · 0 评论 -
关于C语言printf输出颜色的问题.
#defineNONE"\033[m"#defineRED"\033[0;32;31m"#defineLIGHT_RED"\033[1;31m"#defineGREEN"\033[0;32;32m"#defineLIGHT_GREEN"\033[1;32m"#defineBLUE"\033[0;32;34m"#defineLIGHT_BLUE"...原创 2019-04-16 22:29:17 · 6547 阅读 · 2 评论 -
关于文件操作的\r\n问题。
在windows下:void fun(){ FILE *fp = fopen("test.txt", "w"); if (NULL == fp) { printf("open file error!\n"); return; } fprintf(fp, "\n"); fclose(fp); fp = NULL;}以二进制的方式打开test.txt...原创 2019-04-27 10:03:46 · 889 阅读 · 0 评论 -
指向void的指针
【万能指针】一个指向任何对象类型的指针都可以赋值给类型为void*的变量,void*可以赋值给另外一个void *,俩个void *可以比较相等与否,而且可以显式地将void*转换到另一个类型。其他操作都是不安全的,因为编译器并不知道实际被指向的是那种对象。因此,对void*做其他任何操作都将引起编译错误。要使用void * 我们就必须显示地将它转换到某个指向特定类型的指针。例如,voi...原创 2019-05-03 20:14:10 · 1398 阅读 · 0 评论 -
C语言 文件操作实现复制的功能
使用二进制打开可以复制大型文件如:.exe文件,音频视频文件等。#include <stdio.h>#define MAXSIZE 4096#define MAXPATH 1024int main(int argc, char *argv[]){ if (argc != 3) { fprintf(stdout, "Usage: mycp sourcefile ...原创 2019-04-25 13:53:22 · 2610 阅读 · 0 评论 -
C语言复习巩固知识点_01_内存四区的理解&void *类型的指针占有多大的内存空间
数据类型的概念:类型是对数据的抽象。 类型相同的数据有相同的表示形式、储存格式以及相关操作。 程序中使用的所有数据都必定属于某一种数据类型。数据类型的本质:数据类型其实就是创建变量的摸具;是固定大小内存块的别名。 数据类型的作用:编译器预算对象(变量)分配的内存空间大小。程序举例,数据类型的大小。sizeof(数据类型) sizeof(int *);测试用例:...原创 2019-03-17 00:39:46 · 1093 阅读 · 0 评论