结构值正以一种意想不到的方式从一个函数变为另一个函数

时间:2018-07-11 14:09:37

标签: c gcc gdb

#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>

typedef struct
{
    unsigned char a[3];
    unsigned short data[3];
    unsigned int d1;
    unsigned int d2;
} abc; 

void f1(abc *ptr)
{
    printf("values are :0x%x  \t0x%x  \t0%x",ptr->data[0],ptr->data[1],ptr->data[2]);
    //Hex map of ptr  is given below (taken by  gdb --> x/20b ptr )
    //ptr-->0x01 0x00 0x00 0x00 0x44 0x29 0xff 0xff
    //      0xff 0xff        
}
void f()
{
    abc req;
    req.a[0]=1;
    req.a[1]=0;
    req.a[2]=0;
    req.data[0]=0x2944;
    req.data[1]=0xffff;
    req.data[2]=0xffff;
    req.d1= 0xffff;
    req.d2= 0xffff;
    f1(&req);   

    //Hex map of req  is given below (taken by  gdb --> x/20b req )
    // req--> 0x01 0x00 0x00 0x00 0x44 0x29 0xff 0xff
    //        0xff 0xff    
}
int main()
{
    f();
    return 0;
}

我正在处理上面给出的代码示例。 在1个函数中的一个结构中填充值,并将结构传递给其他函数。 但是struct的值在调用函数中已更改。当我用gdb检查时,结构字节表示形式是相同的。 但是有些价值观是如何改变的。任何人都可以解释发生了什么事以及如何克服它 gcc版本为4.9.3,gdb版本为7.7.1,操作系统为ubuntu 14。

下面是gdb的输出。

req values in f() --> 
(gdb) p/x req
$1 = {
  a = {0x1, 0x0, 0x0},
  data = {0x2944, 0xffff, 0xffff},
  d1 = 0xffff,
  d2 = 0xffff

(gdb) x/20b &req
0xffffcb80:     0x01    0x00    0x00    0x00    0x44    0x29    0xff    0xff


ptr values in f1()---->
(gdb) p/x *ptr
$1 = {
  a = {0x1, 0x0, 0x0},
  data = {0x4400, 0xff29, 0xffff},

  (gdb) x/20b ptr
0xffffcb80:     0x01    0x00    0x00    0x00    0x44    0x29    0xff    0xff

1 个答案:

答案 0 :(得分:0)

  

任何人都可以解释发生了什么事

最可能的解释是

  • 函数ff1位于不同的翻译单元中,并且
  • struct abc的定义在它们之间是不同的(例如,在一个翻译单元中,结构具有__attribute__((packed)),而在另一翻译单元中则没有。 / li>

如果是,则违反了ODR(一个定义规则);您的程序格式错误,不需要编译器诊断。

sizeof(struct abc)f中同时打印f1是确认或反驳此猜测的一种方法。

如果大小 不同,则保存预处理输出(gcc -E)并查看内部struct abc的定义方式可能会发光。