我有一项任务要做,任务的内容是:
请提供链接列表的定义,以便将此人的姓名和年龄保持在灵活的结构中。然后编写插入具有给定名称和年龄的元素的过程。
灵活的结构究竟是什么?如何定义?然后如何malloc的大小?
typedef struct Test {
int age; // ?
char name[?]; // ?
struct Test * next;
}Structure;
int main(void) {
Structure *one = malloc(???);
}
答案 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的字符取决于程序员决定/实现。