تتغير قيم البنية من وظيفة إلى أخرى بطريقة غير متوقعة

1
#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

1 إجابة

0

Can any one explain what happened

التفسير الأكثر ترجيحًا هو ذلك

  • وظائف f و f1 في وحدات ترجمة مختلفة ، و
  • تعريف struct abc يختلف بينهما (على سبيل المثال ، في وحدة ترجمة واحدة لدى البنية __attribute__((packed)) ، بينما في الآخر لا.

إذا كان الأمر كذلك ، فهذا انتهاك ODR (قاعدة تعريف واحد) ؛ برنامجك غير صحيح ، ولا يلزم تشخيص المترجم.

الطباعة sizeof(struct abc) معا f و f1 هي طريقة لتأكيد أو دحض هذا التخمين.

إذا أحجام مختلفة، ثم حفظ الانتاج المجهزة مسبقا ( gcc -E ) والبحث في الداخل عن الكيفية struct abc تم تعريفه على الأرجح سيكون مضيئًا.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام