在c中为结构成员赋值而不使用成员名称?

在c中为结构成员赋值而不使用成员名称?,c,pointers,structure,pointer-to-member,C,Pointers,Structure,Pointer To Member,我有一个结构,我想做的是使用for循环为其成员赋值。这样我就不用用会员的名字了。因为结构很长,我不想要20行p\u struct->member\u name等。我目前拥有的内容如下,但我不确定我的方向是否正确。 在头文件中: typedef struct { int x; char ch; ... ... }data; data g_data; 在.c文件中 data *p_data; p_data = &(g_data.x) for(i=0 till struct_el

我有一个结构,我想做的是使用for循环为其成员赋值。这样我就不用用会员的名字了。因为结构很长,我不想要20行
p\u struct->member\u name
等。我目前拥有的内容如下,但我不确定我的方向是否正确。
在头文件中:

typedef struct {
 int x;
 char ch;
  ...
  ...
}data;
data g_data;
在.c文件中

data *p_data;
p_data = &(g_data.x)
for(i=0 till struct_elements) {
    *p_data = (some value);
    p_data++; //next member
}

您不是,p_data是指向数据的指针,p_data++将向上移动它的大小(data)字节,这不是下一个成员,而是在您的结构之外。此外,由于成员的类型不同,即使该问题已得到解决,该方法也无法工作。

您不是,p_data是指向数据的指针,p_data++将其向上移动sizeof(data)字节,这不是下一个成员,而是在您的结构之外。此外,由于成员的类型不同,即使该问题已得到解决,该方法也不起作用。

这不是有效的C。但有效的C是将每个成员的类型和偏移量制成常数表,并在循环中使用:

struct struct_def {
    int typecode;
    size_t offset;
};

static const struct struct_def mystruct_def[] = {
    { TYPE_INT, offsetof(struct mystruct, x) },
    { TYPE_CHAR, offsetof(struct mystruct, y) },
    /* ... */
    { TYPE_NONE, 0 }
};
然后您可以访问成员
x
作为
*(int*)((char*)foo+mystruct_def[0].offset)


这只是一个例子;真实世界的使用可能会更复杂一些…

这不是有效的C。但有效的C是制作每个成员的类型和偏移量的常量表,并在循环中使用:

struct struct_def {
    int typecode;
    size_t offset;
};

static const struct struct_def mystruct_def[] = {
    { TYPE_INT, offsetof(struct mystruct, x) },
    { TYPE_CHAR, offsetof(struct mystruct, y) },
    /* ... */
    { TYPE_NONE, 0 }
};
然后您可以访问成员
x
作为
*(int*)((char*)foo+mystruct_def[0].offset)


这只是一个例子;现实世界的用法可能会更精细一些……

如果它只是一个你正在试图解决的可读性问题,那么你应该考虑使用结构初始化器:

typedef struct { int a,b,c,d,e } data; 

data g_data[10];
int i;
for (i=0;i<10;i++) 
{
 data t={i,i*2,i*3,i*4,i*5 }; /* non-constant initializers are supported with C99, C++, GNU-C or MSVC..*/
 g_data[i]=t; /* the optimizer will turn this into direct stores.. */
}
typedef结构{inta,b,c,d,e}数据;
数据g_数据[10];
int i;

对于(i=0;i),如果它仅仅是一个可读性问题,你试图解决,那么你应该考虑使用结构初始化:

typedef struct { int a,b,c,d,e } data; 

data g_data[10];
int i;
for (i=0;i<10;i++) 
{
 data t={i,i*2,i*3,i*4,i*5 }; /* non-constant initializers are supported with C99, C++, GNU-C or MSVC..*/
 g_data[i]=t; /* the optimizer will turn this into direct stores.. */
}
typedef结构{inta,b,c,d,e}数据;
数据g_数据[10];
int i;

对于(i=0;如果我使用#pragma pack会有帮助吗?比20行p#u struct->member#u name更难看的是任何混淆代码的解决方案。如果初始化让你如此困扰,请将其包装在函数中。如果我使用#pragma pack会有帮助吗?比20行p#struct->member#u name更难看的是任何混淆代码的解决方案正在进行。如果初始化让您如此困扰,请将其包装在函数中。这是标准的C99,因此它现在几乎可以在任何地方工作(MSVC除外)。这是标准的C99,因此它现在几乎可以在任何地方工作(MSVC除外)。