1. 文件重复包含问题
- 什么是重复包含问题:
x.h #include z.h y.h #include z.h z.h struct Student { int level; };
- 如果此时有个文件同时包含了x.h和y.h会出问题
解决方案#if !defined(ZZZ) //这句话的意思可以这样去理解,如果ZZZ已经存在了,就不在声明 #define ZZZ //ZZZ相当于一个编号,越复杂越好,唯一的. struct Student { int level; }; #endif
2. malloc 函数
- 使用流程
//声明指针 int* ptr; //在堆中申请内存,分配128个int ptr = (int *)malloc(sizeof(int)*128); //无论申请的空间大小,一定要进行校验判断是否申请成功 if(ptr == NULL) { return 0; } //初始化分配的内存空间 memset(ptr,0,sizeof(int)*128); //开始使用 *(ptr) = 1; //使用完毕 释放申请的堆空间 free(ptr); //将指针设置为NULL ptr = NULL;
3. 文件读写相关函数
(1) fopen函数 打开文件函数 (打开一个文件并返回文件指针)
(2) fseek函数 查找文件头或者尾函数 (移动文件的读写指针到指定的位置)
(3) ftell函数 定位指针函数 (获取文件读写指针的当前位置)
(4) fclose函数 关闭文件函数 (关闭文件流)
(5) fread函数 读取文件内容函数 (从文件流中读取数据)
相关问题
- 将记事本的.exe文件读取到内存,并返回读取后在内存中的地址
大概思路:
(1)打开文件
(2)得到文件的大小 --> 读取文件到内存,然后跳转到文件末尾,查看跳转的长度
(3)根据大小申请内存
(4)把文件中内容读取到内存里
(5)返回内存编号 - 将内存中的数据存储到一个文件中,(.exe格式),然后双击打开,看是否能够使用
详解1
PE文件解析参考1详解2 记事本路径:C:\cntflx #define F_PATH "C:\\cntflx\\notepad.exe" question 1: #include "stdafx.h" #include <malloc.h> #include <string.h> #include <stdlib.h> #include <memory.h> #define F_PATH "C:\\cntflx\\notepad.exe" int Pe_Getfile_Size() { FILE* fp=fopen(F_PATH,"r"); if (!fp) { return -1; } fseek(fp,0L,SEEK_END); int size = ftell(fp); fseek(fp,0,SEEK_SET); fclose(fp); return size; } int FileSizes = Pe_Getfile_Size(); int Pe_ReadMemtory_addrs1() { //定义一个文件的指针,并初始化其为NULL FILE* fstream = NULL; //初始化exe文件长度 int FstreamSizes = 0; //准备打开文件notepad.exe ,读写,且是读二进制文件 fstream = fopen(F_PATH,"ab+"); //获取打开文件的exe大小 FstreamSizes = FileSizes; // printf("%d \n",FstreamSizes); //申请动态内存指向FileBuffer int* FileBuffer = (int*)malloc(FstreamSizes); //判断申请的内存是否成功,不成功就返回0,成功就开始读exe内容写入申请的内存中 if (FileBuffer == NULL) { return 0; } else { fread(FileBuffer,FstreamSizes,1,fstream); } memset(FileBuffer,0,Pe_Getfile_Size()); //返回内存编号 int addr = (int)FileBuffer; printf("%x \n",addr); //释放申请的内存空间 free(FileBuffer); FileBuffer = NULL; fclose(fstream); return 0; } int main(int argc, char* argv[]) { Pe_ReadMemtory_addrs1(); return 0; } question 2: #include "stdafx.h" #include <malloc.h> #include <string.h> #include <stdlib.h> #include <memory.h> #define F_PATH "C:\\cntflx\\notepad.exe" #define W_PATH "C:\\cntflx\\newnotepad.exe" int Pe_Getfile_Size() { FILE* fp=fopen(F_PATH,"r"); if (!fp) { return -1; } fseek(fp,0L,SEEK_END); int size = ftell(fp); fseek(fp,0,SEEK_SET); fclose(fp); return size; } int FileSizes = Pe_Getfile_Size(); int Pe_ReadMemtory_addrs1() { //定义两个文件的指针,并初始化为NULL FILE* fstream1 = NULL; FILE* fstream2 = NULL; //初始化exe文件长度 int FstreamSizes = 0; //准备打开文件notepad.exe ,读写,且是读二进制文件 fstream1 = fopen(F_PATH,"ab+"); //写入一个新的不存在的exe文件 fstream2 = fopen(W_PATH,"ab+"); //获取打开文件的exe大小 FstreamSizes = FileSizes; // printf("%d \n",FstreamSizes); //申请动态内存指向FileBuffer int* FileBuffer = (int*)malloc(FstreamSizes); //判断申请的内存是否成功,不成功就返回0 //成功的话就开始读exe文件内容,写入到另一个exe文件中 if (FileBuffer == NULL) { return 0; } else { fread(FileBuffer,FstreamSizes+1,1,fstream1); fwrite(FileBuffer,FstreamSizes,1,fstream2); } memset(FileBuffer,0,Pe_Getfile_Size()); //释放堆中申请的内存,并关闭打开的文件流 free(FileBuffer); FileBuffer = NULL; fclose(fstream1); fclose(fstream2); return 0; } int main(int argc, char* argv[]) { Pe_ReadMemtory_addrs1(); return 0; }
PE文件解析参考2