📜  C语言结构中的灵活数组成员

📅  最后修改于: 2021-05-25 21:53:57             🧑  作者: Mango

灵活数组成员(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

重要事项:

  1. 相邻的内存位置用于将结构成员存储在内存中。
  2. 在以前的C编程语言标准中,我们能够声明一个零大小的数组成员来代替一个灵活的数组成员。符合C89标准的GCC编译器将其视为零大小数组。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。