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结构体的后面
应该在cmd结构体的后面
#3
在后面,而且是在一个位置的地方
#4
能告诉下为什么吗,cdm+1应该是地址上加1,地址加1了,为什么能跳过那么大的内存空间呢?
#5
电脑没下turbo C不清楚怎么用其它方法测试,能帮忙测下吗?
#6
int *req = (int*)cmd+1 //指向结构体成员result的位置
int *req = (int *)(cmd+1)//指向cmd结构体的后面
#7
因为 指针指向的数据类型是你的结构体,当指针变量+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和汇编的对应关系。”
不是一回事!
(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
这个应该是设计指针类型的知识了,p++,加的地址是P的整个类型大小1*sizeof(P),可不一定是1
#11
这段程序很危险,req可能会指向错误的地址。
不知道你到底想把req指向什么地方?如果是想指到iresult,那么用(int *)cmd +1算是凑乎,如果想偏移一个cmd head,那么没必要用个int *转来转去这么麻烦,直接转成byte*跳个head大小,既好理解又安全。
不知道你到底想把req指向什么地方?如果是想指到iresult,那么用(int *)cmd +1算是凑乎,如果想偏移一个cmd head,那么没必要用个int *转来转去这么麻烦,直接转成byte*跳个head大小,既好理解又安全。
#1
在cmd结构体的后面
#2
测试下不就知道了
应该在cmd结构体的后面
应该在cmd结构体的后面
#3
在后面,而且是在一个位置的地方
#4
能告诉下为什么吗,cdm+1应该是地址上加1,地址加1了,为什么能跳过那么大的内存空间呢?
#5
电脑没下turbo C不清楚怎么用其它方法测试,能帮忙测下吗?
#6
int *req = (int*)cmd+1 //指向结构体成员result的位置
int *req = (int *)(cmd+1)//指向cmd结构体的后面
#7
因为 指针指向的数据类型是你的结构体,当指针变量+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和汇编的对应关系。”
不是一回事!
(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
这个应该是设计指针类型的知识了,p++,加的地址是P的整个类型大小1*sizeof(P),可不一定是1
#11
这段程序很危险,req可能会指向错误的地址。
不知道你到底想把req指向什么地方?如果是想指到iresult,那么用(int *)cmd +1算是凑乎,如果想偏移一个cmd head,那么没必要用个int *转来转去这么麻烦,直接转成byte*跳个head大小,既好理解又安全。
不知道你到底想把req指向什么地方?如果是想指到iresult,那么用(int *)cmd +1算是凑乎,如果想偏移一个cmd head,那么没必要用个int *转来转去这么麻烦,直接转成byte*跳个head大小,既好理解又安全。