在C中定义弹性/柔性结构

时间:2015-08-29 18:52:51

标签: c structure

我有一项任务要做,任务的内容是:

请提供链接列表的定义,以便将此人的姓名和年龄保持在灵活的结构中。然后编写插入具有给定名称和年龄的元素的过程。

灵活的结构究竟是什么?如何定义?然后如何malloc的大小?

typedef struct Test {
int age; // ?
char name[?]; // ?
struct Test * next;
}Structure;

int main(void) {
Structure *one = malloc(???);
}

2 个答案:

答案 0 :(得分:4)

你走在正确的轨道上。但是,没有“灵活的结构”。您想在struct中使用灵活的数组成员(自C99以来有用):

typedef struct {
    int age;
    size_t name_size;    // size of the array, not length of the name!
    char name[];         // Flexible array member
} Structure;

int main(void) {
    Structure *one = malloc(sizeof(*one) + SIZE_OF_NAME_ARRAY);
}

注意我添加了一个name_size字段。 C不存储已分配数组的大小,因此您可能需要这样做以进行安全复制/比较等(防止缓冲区溢出)。

使用*one使该术语与实际使用的类型无关。这种结构的大小就好像arrray的元素为零。但是,它将正确对齐,因此它可能与没有数组的相同struct不同。

另请注意,如果使用char数组以外的其他数据,则必须更改分配的大小sizeof(element_type) * ARRAY_SIZE。这不是char的必要条件,因为它们的大小由标准定义为1

答案 1 :(得分:1)

我的猜测:一个灵活的结构可以处理任何年龄和任何名称。

unsigned int字段可以处理任何年龄(在合理范围内)。

char *字段可以处理任何名称。

结构本身将是:

struct nameAge { unsigned int age;  char * pName; };  

结构的一个实例是:

struct nameAge myNameAge;

设置age字段为:

myNameAge.age = ageValue;

设置name字段为:

myNameAge.name = malloc( numCharactersInName+1 );
strcpy( myNameAge.name, nameString );

代码如何获得ageValue的年龄和/或NameString的字符取决于程序员决定/实现。