#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;
}
أنا أعمل على عينة التعليمات البرمجية الواردة أعلاه. تعبئة القيم في بنية واحدة في وظيفة واحدة وتمرير البنية إلى وظيفة أخرى. ولكن يتم تغيير قيم البنية في وظيفة المتصل. عندما راجعت مع gdb ، يكون تمثيل بايت الهيكل هو نفسه. لكن بعض كيفية تغيير القيم. يمكن لأي شخص أن يشرح ما حدث وكيفية التغلب عليه إصدار gcc هو 4.9.3 وإصدار gdb هو 7.7.1 ونظام التشغيل هو أوبونتو 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