首页
社区
课程
招聘
[旧帖] 关于typedef定义的结构传参内存的问题 0.00雪花
发表于: 2013-5-27 11:57 4298

[旧帖] 关于typedef定义的结构传参内存的问题 0.00雪花

2013-5-27 11:57
4298
struct A
{
    int val1;
    int val2;
};

typedef A *PA

或者
typedef struct tagA
{
    int val1;
    int val2;
} A,*PA
是一样的

如果我定义
PA ss;
是不是这个ss只有四个字节,并没有为val1和val2分配内存,只是分配了指针的内存?
直接操作 ss->val1=1,这样是非法的,必须要A a; ss=&a;以后才是合法的对吧。

假如 再定义typedef PA *PPA

关键问题是有些WINDOWS API需要二级指针传入 func( _out PPA ppa),

这个时候我是需要先定义一个A类型的a
A a;
PA ss;
PPA sss;
ss=&a;
sss=&ss;
再传入sss这样来做;还是
直接定义一个 PPA sss;传入sss就行了???函数内部会申请对应的内存??
因为我看到有人使用某个API的时候,具体不记得哪个了。就是直接定义PPA sss传入sss的
是不是他写错了,还是和_out或者_in传入传出有关?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
A a;
PA ss;
PPA sss;
ss=&a;
sss=&ss;
再传入sss这样来做//就相当于在外部就指向了数据,内部可以使用指向的数据。
直接定义一个 PPA sss//这只是传 了一个地址,内部只能把数据传给外部。
不知道听明白没有
2013-5-27 13:47
0
雪    币: 111
活跃值: (113)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
A a;//为val1和val2申请空间
PA ss;//只是一个地址,4节字,4字节填充随机数据,也主是传说中的野指针
PPA sss;//一样,4字节,随机数据,传说中的野指针
ss=&a;//ss指向a地址内存,ss终于不是野孩子了!!!
sss=&ss;//sss指向ss地址内存,sss终于不是野孩子了!!!

直接定义一个 PPA sss,传入sss 肯定不行。没有可以操作的内存,因为一级指针ss还不知道指向哪里。野孩子是不能操作赋值的,不然会引起异常。。。
2013-5-27 14:14
0
雪    币: 1392
活跃值: (4867)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
只传sss如果内部要向val1写入数据是不是非法的?这个时候外部没有分配val1啊
2013-5-27 15:16
0
雪    币: 1392
活跃值: (4867)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
5
其实我也感觉是这样的,只是看到有的代码只要类型对了就行了,没有分配结构,只分配了结构的二级指针,以为是函数内部在堆里面申请了一份。
2013-5-27 15:20
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼上都对!说的是原理.
结合到事实:
如果是你自己的代码,你遵循自己的编程规范(自己申请自己使用?自己申请大家使用?别人申请自己使用别人释放?).
如果是别人的不可见代码模块,则只能跟进去看,或者都试验下了.
2013-5-27 15:56
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
out 是输出参数类型,所以外围必须要进行初始化的动作,而不是单纯的声明就可以的。
2013-6-5 09:52
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你可以看一下_out的定义,应该是一个空的宏定义(#define _out)(不过我好像只见过OUT没有_out,我很好奇在那个头文件中),所以它只是一个标识没有任何实际的限制意义,它的作用是告诉使用者这是一个输出参数。
它是一个指针的指针,目的是修改指针,函数内部分配结构体,并通过你传入的指针的指针修改指针,这样将结构体的地址传出。
你需要这样定义
PA ss;
PPA sss;
sss=&ss;
函数执行完毕,ss已经指向一个函数生成的结构体。
2013-6-5 10:21
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不是结构体的问题 把结构体换成其他指针也一样 你没分配内存就操作他 不对

int *p;
*p =5;   运行肯定报错 p没有分配内存 p = new int(5);就对了
int a =10;

p = &a; p指向a的内存空间 这时候p的地址有效
2013-6-5 20:44
0
游客
登录 | 注册 方可回帖
返回
//