1

我有一个结构,我想做的是使用 for 循环为其成员分配值。这样我就不必使用成员名称。因为结构很长,我不想要 20 行p_struct->member_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
}
4

3 回答 3

2

这不是有效的 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).

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

于 2011-09-15T14:10:37.207 回答
1

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

于 2011-09-15T14:10:07.023 回答
1

如果这只是您要解决的可读性问题,那么您应该考虑使用结构初始化器:

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.. */
}

如果您使用 gcc(或 C99 编译器,感谢 Dietrich Epp 的提醒),那么您甚至可以编写:

for (i=0;i<10;i++) 
{
 g_data[i]=(data){i,i*2,i*3,i*4,i*5 }; 
}
于 2011-09-15T14:22:38.833 回答