c结构成员在订单更改时意外更改

时间:2013-08-02 04:02:40

标签: c structure

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

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移动到第二个或任何其他位置)结构声明例如)没有任何问题,所有的价值都很好!所以我猜这不是因为内存管理错误,例如在该函数期间指向数组外部。

如果你能帮我理解这里发生的事情,我将非常感激!

1 个答案:

答案 0 :(得分: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置于八字节边界上。

然而,解决方案是找出破坏数据的内容并解决问题。