gpt4 book ai didi

c++ - 访问库函数中的结构成员时出现段错误

转载 作者:行者123 更新时间:2023-12-02 10:36:39 24 4
gpt4 key购买 nike

以下问题:
在我的主程序中,我声明 struct 变量,然后将地址传递给库函数(共享对象,由我编译)。库函数应该初始化结构,但它会因段错误而崩溃。当结构的成员(类型 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 结构的大小不同。

    所以最后这只是我的愚蠢,但无论如何感谢您的有用评论。

    关于c++ - 访问库函数中的结构成员时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59952666/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com