#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
答案 0 :(得分:0)
任何人都可以解释发生了什么事
最可能的解释是
f
和f1
位于不同的翻译单元中,并且struct abc
的定义在它们之间是不同的(例如,在一个翻译单元中,结构具有__attribute__((packed))
,而在另一翻译单元中则没有。 / li>
如果是,则违反了ODR(一个定义规则);您的程序格式错误,不需要编译器诊断。
在sizeof(struct abc)
和f
中同时打印f1
是确认或反驳此猜测的一种方法。
如果大小 不同,则保存预处理输出(gcc -E
)并查看内部struct abc
的定义方式可能会发光。