灵活数组成员(FAM)是C编程语言的C99标准中引入的功能。
- 对于从C99标准开始使用C编程语言的结构,我们可以声明一个不带维数且其大小本质上灵活的数组。
- 结构内部的此类数组最好应声明为结构的最后一个成员,并且其大小是可变的(可以在运行时更改)。
- 结构必须含有除了柔性阵列成员的至少一个多个命名成员。
以下结构的大小必须是多少?
struct student
{
int stud_id;
int name_len;
int struct_size;
char stud_name[];
};
The size of structure is = 4 + 4 + 4 + 0 = 12
在上面的代码片段中,数组“ stud_name”的大小(即长度)不是固定的,而是FAM。
对于上面的示例,使用灵活的数组成员(按照C99标准)的内存分配可以通过以下方式完成:
struct student *s = malloc( sizeof(*s) + sizeof(char [strlen(stud_name)]) );
注意:在结构中使用灵活数组成员时,会定义一些有关成员实际大小的约定。
在上面的示例中,约定是成员“ stud_name”具有字符大小。
例如,考虑以下结构:
Input : id = 15, name = "Kartik"
Output : Student_id : 15
Stud_Name : Kartik
Name_Length: 6
Allocated_Struct_size: 18
以上结构的内存分配:
struct student *s =
malloc( sizeof(*s) + sizeof(char [strlen("Kartik")]));
其结构表示等于:
struct student
{
int stud_id;
int name_len;
int struct_size;
char stud_name[6]; //character array of length 6
};
执行
// C program for variable length members in
// structures in GCC
#include
#include
#include
// A structure of type student
struct student
{
int stud_id;
int name_len;
// This is used to store size of flexible
// character array stud_name[]
int struct_size;
// Flexible Array Member(FAM)
// variable length array must be last
// member of structure
char stud_name[];
};
// Memory allocation and initialisation of structure
struct student *createStudent(struct student *s,
int id, char a[])
{
// Allocating memory according to user provided
// array of characters
s =
malloc( sizeof(*s) + sizeof(char) * strlen(a));
s->stud_id = id;
s->name_len = strlen(a);
strcpy(s->stud_name, a);
// Assigning size according to size of stud_name
// which is a copy of user provided array a[].
s->struct_size =
(sizeof(*s) + sizeof(char) * strlen(s->stud_name));
return s;
}
// Print student details
void printStudent(struct student *s)
{
printf("Student_id : %d\n"
"Stud_Name : %s\n"
"Name_Length: %d\n"
"Allocated_Struct_size: %d\n\n",
s->stud_id, s->stud_name, s->name_len,
s->struct_size);
// Value of Allocated_Struct_size is in bytes here
}
// Driver Code
int main()
{
struct student *s1 = createStudent(s1, 523, "Cherry");
struct student *s2 = createStudent(s2, 535, "Sanjayulsha");
printStudent(s1);
printStudent(s2);
// Size in struct student
printf("Size of Struct student: %lu\n",
sizeof(struct student));
// Size in struct pointer
printf("Size of Struct pointer: %lu",
sizeof(s1));
return 0;
}
输出:
Student_id : 523
Stud_Name : SanjayKanna
Name_Length: 11
Allocated_Struct_size: 23
Student_id : 535
Stud_Name : Cherry
Name_Length: 6
Allocated_Struct_size: 18
Size of Struct student: 12
Size of Struct pointer: 8
重要事项:
- 相邻的内存位置用于将结构成员存储在内存中。
- 在以前的C编程语言标准中,我们能够声明一个零大小的数组成员来代替一个灵活的数组成员。符合C89标准的GCC编译器将其视为零大小数组。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。