VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 537|回复: 6

PE 函数 将硬盘中的文件读取到缓冲区 为什么第二个参数必须是2个*

[复制链接]
76_avatar_middle
最佳答案
0 
在线会员 发表于 2019-2-14 11:47:26 | 显示全部楼层 |阅读模式
3驿站币
本帖最后由 13362425795 于 2019-2-14 11:59 编辑

DWORD ReadPEFile(IN  LPSTR IpszFile,  OUT  LPVOID* pFileBuffer)     //为什么第二个参数必须是2个*
{
    //打开文件
           FILE* pFile = NULL;
      pFile = fopen(IpszFile,"rb");
           if(!pFile)
           {   printf("文件打开失败");
               return 0;
           }
//读取文件大小
DWORD fileSize = 0;
           fseek(pFile,0,SEEK_END);
           fileSize = ftell(pFile);
           fseek(pFile,0,SEEK_SET);
     ………………………………
     ………………………………
          }
    //关闭文件
     *pFileBuffer = pTempFileBuffer;                                             
     pTempFileBuffer = NULL;
     fclose(pFile);
     return fileSize;
}

最佳答案

查看完整内容

一个函数如果要往一个指针指向的缓冲区中存数据,那么参数直接传递这个指针就可以了; 但是,如果这个函数是要更改参数指针的指向地址,那么必须传递该指针的地址(也就是二级指针)或者引用 这样才可以。




上一篇:VC6.0的LIB在VS2012上异常,LNK2019异常
下一篇:sublime text 2 怎么配置c/c++
77_avatar_middle
最佳答案
31 
online_vip 发表于 2019-2-14 11:47:27 | 显示全部楼层
一个函数如果要往一个指针指向的缓冲区中存数据,那么参数直接传递这个指针就可以了;
但是,如果这个函数是要更改参数指针的指向地址,那么必须传递该指针的地址(也就是二级指针)或者引用
这样才可以。

评分

参与人数 1威望 +2 驿站币 +2 热心值 +2 收起 理由
51_avatar_small Syc + 2 + 2 + 2 很给力!

查看全部评分

76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-2-15 04:15:35 | 显示全部楼层
Health 发表于 2019-2-14 12:56
一个函数如果要往一个指针指向的缓冲区中存数据,那么参数直接传递这个指针就可以了;
但是,如果这个函数 ...

但假如我把参数定义成1个* 即LPVOID  pFileBuffer
那么最后在给这个参数指针赋值的时候写成 pFileBuffer = pTempFileBuffer;  也照样能通过
所以请问Health,这又怎么解释

76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-2-15 04:25:52 | 显示全部楼层
但假如我把第二个参数定义成1个* 即LPVOID pFileBuffer,那么最后给它赋值时写成 pFileBuffer = pTempFileBuffer;  也照样能通过,请问Health,这又怎么解释  
51_avatar_middle
最佳答案
82 
online_admins 发表于 2019-2-15 10:07:27 | 显示全部楼层
13362425795 发表于 2019-2-15 04:15
但假如我把参数定义成1个* 即LPVOID  pFileBuffer
那么最后在给这个参数指针赋值的时候写成 pFileBuffer ...

这样改的话编译是没问题,但是从函数出来之后,指针的值还是调用函数之前的值,不是函数中改的值,明白了吗?
76_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-2-15 12:21:29 | 显示全部楼层
Syc好,  
DWORD ReadPEFile(IN LPSTR IpszFile, OUT LPVOID pFileBuffer)     //如果我将第二个参数定义成这样子
{
   //打开文件
         FILE* pFile = NULL;
         pFile = fopen(IpszFile,"rb");
         if(!pFile)
         {
              printf("文件打开失败");
              return 0;
         }
   //读取文件大小
         DWORD fileSize = 0;
         fseek(pFile,0,SEEK_END);
         fileSize = ftell(pFile);
         fseek(pFile,0,SEEK_SET);
   //分配缓冲区
         LPVOID pTempFileBuffer = NULL;
         pTempFileBuffer = malloc(fileSize);
         if(!pTempFileBuffer)
         {
               printf("申请空间失败");
               fclose(pFile);
               return 0;
         }
   //将文件读取到缓冲区中
         size_t n = fread(pTempFileBuffer,1,fileSize,pFile);
         if(!n)
         {
                printf("文件数据失败");
                free(pTempFileBuffer);
                fclose(pFile);
                return 0;
         }
   //关闭文件
         pFileBuffer = pTempFileBuffer;          //这里写成这样子的话, 这个值也是可以赋过去的呀                                         
         pTempFileBuffer = NULL;
         fclose(pFile);
         return fileSize;
}
72_avatar_middle
最佳答案
0 
在线会员 发表于 2019-2-15 20:04:54 | 显示全部楼层
  不知道楼主学没学汇编堆栈传参的知识,同级传参,比如实参是int或short或char,形参也是int或shour或char,这样的话就会复制一份实参放到栈里面,函数执行完之后栈里的数据就会销毁,而实参并不会因为执行该函数而发生变化,所以如果你要通过函数改变实参的值,就要传实参的地址,而形参则需要定义为指针来接收这个实参的地址,同理,你要修改一个指针的值,就要传递这个指针的地址,而接收这个指针的地址的数据就是指针的指针(两个*的类型)       你后面问的问题,相互赋值可以,但是函数实际被调用时你传入的实参并不会发生变化。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-22 14:11

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表