网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月18日漏签0天
c语言吧 关注:801,195贴子:4,371,123
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 1 2 下一页 尾页
  • 28回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

关于“结构体做函数参数 传递的是 什么?”的看法

  • 只看楼主
  • 收藏

  • 回复
  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
原帖子地址为http://tieba.baidu.com/p/1261550391
下面我从汇编的角度给大家讲讲 到底传的是副本还是地址


  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
编译环境 vs2008
源代码如下:
// Structrue.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
typedef struct _STRUDENT{
int number;
char *name;
int age;
bool isMale;
}Student,*pStudent;
void PrintStudent(Student student)
{
printf("%d\n",student.number);
printf("%s\n",student.name);
printf("%d\n",student.age);
if (student.isMale)
{
printf("is a male");
}
else
{
printf("is a female");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Student xiaoma;
xiaoma.number=0x51303;
xiaoma.name="xiaoma";
xiaoma.age=0x21;
xiaoma.isMale=true;
PrintStudent(xiaoma);
getchar();
return 0;
}
运行结果为:



2025-11-18 02:10:14
广告
不感兴趣
开通SVIP免广告
  • 陌上灬飘尘
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
- -你在调用的函数里改一下原来的值,在看主函数输出会不会变不就完了


  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

程序运行到这里的时候 结构体的各个短已经初始化完毕
现在可以看内存中的值了 0x12ff68-8=0x12ff60
0x0012FF54 03 13 05 00 ....
0x0012FF58 0c 58 41 00 .XA.
0x0012FF5C 21 00 00 00 !...
0x0012FF60 01 cc cc cc ....



  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
0x0012FF58 0c 58 41 00 .XA.
这个是"xiaoma"的首地址
这个大家应该知道吧
windows 是小段模式
0c 58 41 00也就是0x0041580c




  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
然后进入函数 发现在 call PrintStudent之前的确是备份了结构体的副本



  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
结构体的副本和结构体的值一模一样

但是别急
点F11 跟进去函数内部 看到底调用了副本还是副本的首地址


  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

看到没 第一个student.number是ebp+08h
第二个student.name 是ebp+0ch
第三个student.age 是ebp+10h
ebp的值等会上图


2025-11-18 02:04:14
广告
不感兴趣
开通SVIP免广告
  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

ebp+08h
ebp+0ch
ebp+10h
恰好是前面的副本的地址:
0x0012fe80到0x12fe74 图见7楼
这样我们就清楚了


  • gtgt154
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
正好昨天看书看到这话,谢LZ解释,深刻理解下


  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
也就是说结构体的确存有副本
但是一个函数的可用地址是很小的。以这个PrintStudent函数为例

可用地址也就0c0h这么大 不可能把一个很大的结构体都传进去的
把副本的起始地址穿进去就行了



  • TCS-董强鸡
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
传值,一般都是副本


  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

都讲这么清楚了你还不懂?
那个地方不懂 在线回答


  • 追忆曾经_
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
LZ恕我直言 就那帖子里跟你争论的那位 他绝对懂


2025-11-18 01:58:14
广告
不感兴趣
开通SVIP免广告
  • ma747959177
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
额 没什么 相互学习;
每个结构体在传入函数之前都会备份一下的
然后函数用备份结构体的地址就行了!


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 28回复贴,共2页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示