簡體   English   中英

如果訪問庫函數中的結構成員,則會出現分段錯誤

[英]Segementation fault if accessing struct member in library function

以下問題:在我的主程序中,我聲明了結構變量,然后將地址傳遞給庫函數(共享對象,由我編譯)。 庫函數應該初始化結構,但它會因分段錯誤而崩潰。 當結構的成員(int 類型)設置為 0 時會發生崩潰。如果我在主程序中設置相同的成員,則不會發生問題。

主程序:C++(用g++編譯)

rnxctr_t tRNX;
tRNX.ephsat = 0;  // <-- works
init_rnxctr(&tRNX);

庫函數:C(用gcc編譯)

extern int init_rnxctr(rnxctr_t *rnx)
{
    gtime_t time0={0};
    obsd_t data0={{0}};
    eph_t  eph0={0,-1,-1};
    geph_t geph0={0,-1};
    seph_t seph0={0};
    int i,j;

    trace(3,"init_rnxctr:\n");

    rnx->obs.data=NULL;
    rnx->nav.eph =NULL;
    rnx->nav.geph=NULL;
    rnx->nav.seph=NULL;

    if (!(rnx->obs.data=(obsd_t *)malloc(sizeof(obsd_t)*MAXOBS ))||
        !(rnx->nav.eph =(eph_t  *)malloc(sizeof(eph_t )*MAXSAT ))||
        !(rnx->nav.geph=(geph_t *)malloc(sizeof(geph_t)*NSATGLO))||
        !(rnx->nav.seph=(seph_t *)malloc(sizeof(seph_t)*NSATSBS))) {
        free_rnxctr(rnx);
        return 0;
    }
    rnx->time=time0;
    rnx->ver=0.0;
    rnx->sys=rnx->tsys=0;
    for (i=0;i<6;i++) for (j=0;j<MAXOBSTYPE;j++) rnx->tobs[i][j][0]='\0';
    rnx->obs.n=0;
    rnx->nav.n=MAXSAT;
    rnx->nav.ng=NSATGLO;
    rnx->nav.ns=NSATSBS;
    for (i=0;i<MAXOBS ;i++) rnx->obs.data[i]=data0;
    for (i=0;i<MAXSAT ;i++) rnx->nav.eph [i]=eph0;
    for (i=0;i<NSATGLO;i++) rnx->nav.geph[i]=geph0;
    for (i=0;i<NSATSBS;i++) rnx->nav.seph[i]=seph0;
    rnx->ephsat=0;    // <-- segmentation fault
    rnx->opt[0]='\0';

    return 1;
}

結構定義:

typedef struct {        /* rinex control struct type */
    gtime_t time;       /* message time */
    double ver;         /* rinex version */
    char   type;        /* rinex file type ('O','N',...) */
    int    sys;         /* navigation system */
    int    tsys;        /* time system */
    char   tobs[7][MAXOBSTYPE][4]; /* rinex obs types */
    obs_t  obs;         /* observation data */
    nav_t  nav;         /* navigation data */
    sta_t  sta;         /* station info */
    int    ephsat;      /* ephemeris satellite number */
    char   opt[256];    /* rinex dependent options */
} rnxctr_t;

更新:鏈接到完整的頭文件:rtklib.h

一些觀察

僅當我啟用(定義)庫的某些可選功能(DENAGAL、DENACMP)時才會出現此問題。 但是與“正常”版本的差異根本無法解釋問題。 發布的代碼中唯一改變的是MAXSAT定義。

更新:我剛剛意識到,那的變化MAXSAT不改變內部結構的大小rnxctr_t (如nav_t

用gdb可以看到主程序和函數中一些成員的地址不同。 主要的:

  • &tRNX: 0x7ffffffc6e10
  • &tRNX.nav: 0x7ffffffc7548
  • &tRNX.ephsat: 0x7fffffffd290

功能:

  • rnx:0x7ffffffc6e10
  • &rnx->導航:0x7ffffffc7548
  • &rnx->ephsat: 0x800000026ef8

最后一點真的讓我感到困惑,因為我不明白這是怎么發生的。

最好的問候邁克爾

我剛剛發現了問題。 我剛剛意識到,我使用了兩個不同版本的 rtklib.h。 這導致了 rnxctr_t 結構的不同大小。

所以最后這只是我的愚蠢,但無論如何感謝您的有用評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM