求教关于结构体指针问题!

时间:2022-12-15 10:45:11
现有结构体:
typedef struct {
       uint32_t id;                //4字节长度
       uint32_t result;
       uint32_t flags;
       uint32_t seq;
       uint16_t resr;
       uint16_t len;
}CMD_HEADER;

在函数中:
CMD_HEADER *cmd=(CMD_HEADER *)&buf;
int *req = (int *)(cmd+1)      //32位机中 int也为4字节

请问req变量的地址与cmd地址之间的关系是什么,换句话说req处于cmd的哪个位置,是再结构体成员result的位置,还是在cmd结构体的后面呢?????


11 个解决方案

#1


在cmd结构体的后面

#2


测试下不就知道了

应该在cmd结构体的后面

#3


在后面,而且是在一个位置的地方

#4


引用 1 楼 tianmo2010 的回复:
在cmd结构体的后面

能告诉下为什么吗,cdm+1应该是地址上加1,地址加1了,为什么能跳过那么大的内存空间呢?

#5


引用 2 楼 war10811 的回复:
测试下不就知道了

应该在cmd结构体的后面

电脑没下turbo C不清楚怎么用其它方法测试,能帮忙测下吗?

#6


引用 5 楼 lightrat2009 的回复:
引用 2 楼 war10811 的回复:
测试下不就知道了

应该在cmd结构体的后面

电脑没下turbo C不清楚怎么用其它方法测试,能帮忙测下吗?

int *req = (int*)cmd+1   //指向结构体成员result的位置
int *req = (int *)(cmd+1)//指向cmd结构体的后面

#7


引用 4 楼 lightrat2009 的回复:
引用 1 楼 tianmo2010 的回复:
在cmd结构体的后面

能告诉下为什么吗,cdm+1应该是地址上加1,地址加1了,为什么能跳过那么大的内存空间呢?


因为 指针指向的数据类型是你的结构体,当指针变量+n的时候,n表示的内存大小就是n*数据类型大小,此时的数据类型大小就是sizeof(struct)

#8


VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

#9


#include <stdio.h>

typedef struct 
{
int a;
int b;
}type;

int main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

type  *p = (type *)a;

p ++; //这里的p跳过sizepof(type)个地址空间
printf("%d %d\n", p->a, p->b); //3 4

return 0;
}

//应该在cmd结构体的后面

#10


我也正在学习结构和指针,
这个应该是设计指针类型的知识了,p++,加的地址是P的整个类型大小1*sizeof(P),可不一定是1

#11


这段程序很危险,req可能会指向错误的地址。
不知道你到底想把req指向什么地方?如果是想指到iresult,那么用(int *)cmd +1算是凑乎,如果想偏移一个cmd head,那么没必要用个int *转来转去这么麻烦,直接转成byte*跳个head大小,既好理解又安全。

#1


在cmd结构体的后面

#2


测试下不就知道了

应该在cmd结构体的后面

#3


在后面,而且是在一个位置的地方

#4


引用 1 楼 tianmo2010 的回复:
在cmd结构体的后面

能告诉下为什么吗,cdm+1应该是地址上加1,地址加1了,为什么能跳过那么大的内存空间呢?

#5


引用 2 楼 war10811 的回复:
测试下不就知道了

应该在cmd结构体的后面

电脑没下turbo C不清楚怎么用其它方法测试,能帮忙测下吗?

#6


引用 5 楼 lightrat2009 的回复:
引用 2 楼 war10811 的回复:
测试下不就知道了

应该在cmd结构体的后面

电脑没下turbo C不清楚怎么用其它方法测试,能帮忙测下吗?

int *req = (int*)cmd+1   //指向结构体成员result的位置
int *req = (int *)(cmd+1)//指向cmd结构体的后面

#7


引用 4 楼 lightrat2009 的回复:
引用 1 楼 tianmo2010 的回复:
在cmd结构体的后面

能告诉下为什么吗,cdm+1应该是地址上加1,地址加1了,为什么能跳过那么大的内存空间呢?


因为 指针指向的数据类型是你的结构体,当指针变量+n的时候,n表示的内存大小就是n*数据类型大小,此时的数据类型大小就是sizeof(struct)

#8


VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

#9


#include <stdio.h>

typedef struct 
{
int a;
int b;
}type;

int main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

type  *p = (type *)a;

p ++; //这里的p跳过sizepof(type)个地址空间
printf("%d %d\n", p->a, p->b); //3 4

return 0;
}

//应该在cmd结构体的后面

#10


我也正在学习结构和指针,
这个应该是设计指针类型的知识了,p++,加的地址是P的整个类型大小1*sizeof(P),可不一定是1

#11


这段程序很危险,req可能会指向错误的地址。
不知道你到底想把req指向什么地方?如果是想指到iresult,那么用(int *)cmd +1算是凑乎,如果想偏移一个cmd head,那么没必要用个int *转来转去这么麻烦,直接转成byte*跳个head大小,既好理解又安全。