【发布时间】: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
【问题讨论】:
-
printf是否打印了预期值? -
我的猜测是
p/x *ptr包括成员之间的padding。相关问题:Why isn't sizeof for a struct equal to the sum of sizeof of each member? -
@Some 程序员老兄,我想你的意思是排除。
-
注意
char[3]后面有一个填充字节。什么都没有改变。 -
@meat 包括就像打印填充字节一样