【问题标题】:struct values are changing from one function to other in unexpected manner结构值以意想不到的方式从一个函数变为另一个函数
【发布时间】:2018-07-11 14:09:37
【问题描述】:
#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;
}

我正在处理上面给出的代码示例。 在一个函数中填充一个结构中的值并将结构传递给另一个函数。 但是 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

【问题讨论】:

标签: c gcc gdb


【解决方案1】:

谁能解释一下发生了什么

最可能的解释是

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

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

ff1 中打印sizeof(struct abc) 是确认或反驳这种猜测的一种方法。

如果大小不同,那么保存预处理输出 (gcc -E) 并在内部查找 struct abc 的定义方式可能会很有启发性。

【讨论】:

  • @shekharsingh 以什么方式重新排列?找到问题了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多