0

我有这个结构,在我的头文件中定义:

struct params
{
    size_t s;       
    float  f1;        
    float  f2;   
    int    i1;   
    float  f3;    
    gsl_matrix_float *gm;
};

我初始化数组和另一个gsl_matrix_float

gsl_matrix_float *another_gsl_matrix;
struct params p;

元素一一填写,例如

p.s=1;p.f1=0.2f;

在程序期间,another_gsl_matrix运行一个完全不相关的功能。但在该函数之后,值p.s变为0! 奇怪的是(对我来说,我猜是因为我缺乏知识!)是当我改变结构成员的声明顺序时(s例如移动到结构声明中的第二个或任何其他位置) 没有问题了,所有的值都很好!所以我猜这不是因为内存管理不善,例如在该函数期间指向数组之外。

如果您能帮助我了解这里发生了什么,我将不胜感激!

4

1 回答 1

3

有些东西正在破坏你的结构。

但是,如果您在其中移动成员,您很可能会引入填充字节,这些字节在被覆盖时不会影响您的其他代码。

C 实现可以自由地将填充插入到成员之间的结构中,以及在最终成员之后,以允许对齐问题。例如,您最终可能会得到以下结果:

struct xyzzy {
    double zorkmid;   // offset 0, 8 bytes
    char   twisty;    // offset 8, 1 byte
                      // offset 9, 3 bytes padding
    int    plugh;     // offset 12, 4 bytes
    int    grue;      // offset 16, 4 bytes
                      // offset 20, 4 bytes padding.
                      // offset 24 for next zorkmid
};

成员之间的填充(从不在开始处)通常是为了在该点之后对齐成员,例如将 放在int四字节边界上。最后一个成员之后的填充通常是为了确保在数组情况下第一个成员对齐例如将 放在double八字节边界上。

但是,解决方案是找出破坏数据的原因并修复它。

于 2013-08-02T04:08:17.637 回答