首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

,同一结构体居然打印出不同结果

2013-12-06 
求助,同一结构体居然打印出不同结果下面代码是使用gdb调试输出的信息(gdb) p/x (char)peer_cpu_beat_frame

求助,同一结构体居然打印出不同结果
下面代码是使用gdb调试输出的信息


(gdb) p/x (char)peer_cpu_beat_frame@33
$34 = {0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xd4, 0x95, 0x52, 0x1, 0x2, 0x0, 0x0, 0xe9, 0x1e, 0x0 <repeats 14 times>, 0x32}
(gdb) p/x *(char*)frame@33                          # 打印内存空间,其余peer_cpu_beat_frame的内存数据完全一样
$35 = {0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xd4, 0x95, 0x52, 0x1, 0x2, 0x0, 0x0, 0xe9, 0x1e, 0x0 <repeats 14 times>, 0x32}
(gdb) p &peer_cpu_beat_frame
$36 = (CpuHeartBeatFrame *) 0x809b900
(gdb) p frame                                       #打印内存地址,表明都是同一地址。
$37 = (const CpuHeartBeatFrame *) 0x809b900
(gdb) ptype peer_cpu_beat_frame                     #确认peer_cpu_beat_frame结构信息
type = struct {
    FrameHead head;
    unsigned char local_cpu_state;
    unsigned char relay_state;
    unsigned char hmi_comm_state;
    unsigned char eeu_comm_state;
    unsigned char dual_series_comm_state;
    unsigned char switch_comm_state;
    unsigned char mo_comm_state;
    unsigned char local_cpu_failure_state;
    unsigned char local_cpu_interlocking_state;
    unsigned int timer_elapsed_cycles;
}
(gdb) p peer_cpu_beat_frame.timer_elapsed_cycles    #打印最后一个变量信息
$38 = 838860800
(gdb) p frame->timer_elapsed_cycles                 #打印最后一个变量信息,发现与上一项不一致,这是为什么?
$39 = 50
(gdb) p &frame->timer_elapsed_cycles                #打印变量所指的地址
$40 = (uint32_t *) 0x809b920
(gdb) p &peer_cpu_beat_frame.timer_elapsed_cycles   #通过打印地址发现果真偏移了3个位置
$42 = (unsigned int *) 0x809b91d
(gdb) bt                                            #下面是程序运行的堆栈信息
#0  cpu_heartbeat_print (frame=0x809b900) at /home/zhangys/platformsoft/01primary/src/syn_data/cpu_heartbeat.c:36
#1  0x080536ea in cpu_recv_heartbeat () at /home/zhangys/platformsoft/01primary/src/core/cpu_communicate.c:174
#2  0x08051407 in cpu_try_recv_heartbeat () at /home/zhangys/platformsoft/01primary/src/core/cpu_heartbeat_int.c:70
#3  0x080514a1 in cpu_beatheart_action () at /home/zhangys/platformsoft/01primary/src/core/cpu_heartbeat_int.c:124
#4  0x0805297d in timer_action (sig=34, si=0xbffff27c, uc=0xbffff2fc) at /home/zhangys/platformsoft/01primary/src/core/timer.c:95
#5  <signal handler called>
#6  fsm_be_end_state (fsm=0x80903e0) at /home/zhangys/platformsoft/01primary/src/core/ci_cycle.c:1200
#7  0x0805279f in fsm_run (fsm=0x80903e0) at /home/zhangys/platformsoft/01primary/src/core/ci_cycle.c:1232
#8  0x0805282c in ci_one_cycle () at /home/zhangys/platformsoft/01primary/src/core/ci_cycle.c:1291
#9  0x08052d34 in run () at /home/zhangys/platformsoft/01primary/src/core/app.c:127
#10 0x08051565 in main (argc=1, argv=0xbffff714) at /home/zhangys/platformsoft/01primary/src/core/main.c:2

cpu_recv_heartbeat函数原型,在cpu_communicate.c当中

int32_t cpu_recv_heartbeat(void)
{
    int ret = 0;
    cpu_heartbeat_clear(&peer_cpu_beat_frame);
    /*务必使用阻塞方式接受*/
    ret = cpu_com_read(ST_HEARTBEAT);

    if (0 == ret)
    {
        log_msg("new elapsed_cycles:%d",peer_cpu_beat_frame.timer_elapsed_cycles);
        cpu_heartbeat_print(&peer_cpu_beat_frame);
    }
    else
    {
        log_msg("CPU未收到心跳数据");
    }

    return ret;
}

cpu_heartbeat_print函数原型,在cpu_heartbeat.c当中


void cpu_heartbeat_print(const CpuHeartBeatFrame* frame)


{
    frame_head_print(&frame->head);

    printf("local_cpu_state             :%d\n",frame->local_cpu_state);
    printf("relay_state                 :%d\n",frame->relay_state);
    printf("hmi_comm_state              :%d\n",frame->hmi_comm_state);
    printf("eeu_comm_state              :%d\n",frame->eeu_comm_state);
    printf("dual_series_comm_state      :%d\n",frame->dual_series_comm_state);
    printf("switch_comm_state           :%d\n",frame->switch_comm_state);
    printf("mo_comm_state               :%d\n",frame->mo_comm_state);
    printf("local_cpu_failure_state     :%d\n",frame->local_cpu_failure_state);
    printf("local_cpu_interlocking_state:%d\n",frame->local_cpu_interlocking_state);
    printf("timer_elapsed_cycles        :%d\n",frame->timer_elapsed_cycles);
}



请诸位大神帮忙解释一下,折腾了一整天了,实在是没找到问题原因的所在,十分感谢
[解决办法]
字节对齐设置不一致把
[解决办法]
看所有文件,是不是有 类似#pragma pack (4),之后都#pragma pack ()回来了,如果设置完没置回,加上就可以了
[解决办法]
同一地址,同一结构体不能保证相同的值,比如你fork()一个子进程,就会出现相同变量的地址一样,但值不同,这个很正常,因为用的都是虚拟地址。
[解决办法]
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//

热点排行