Рубрики

Массивы переменной длины в C и C ++

Массивы переменной длины — это функция, в которой мы можем выделить автоматический массив (в стеке) переменного размера. C поддерживает массивы переменного размера из стандарта C99. Например, приведенная ниже программа компилируется и прекрасно работает на C.

Также обратите внимание, что в стандартах C99 или C11 есть функция, называемая «гибкими элементами массива» , которая работает так же, как и выше.

void fun(int n)

{

  int arr[n];

  // ......

int main()

{

   fun(6);

}

Но стандарт C ++ (до C ++ 11 ) не поддерживает массивы переменного размера. Стандарт C ++ 11 упоминает размер массива как константное выражение. См. (См. 8.3.4 на стр. 179 из N3337 ). Таким образом, приведенная выше программа не может быть допустимой программой C ++. Программа может работать в компиляторе GCC, потому что компилятор GCC предоставляет расширение для их поддержки.

В качестве примечания, в последнем C ++ 14 (см. 8.3.4 на стр. 184 из N3690 ) размер массива упоминается как простое выражение (не константное выражение).

Реализация

// C программа для элементов переменной длины в структурах в GCC до C99.
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

  
// Структура типа студента

struct student

{

   int stud_id;

   int name_len;

   int struct_size;

   char stud_name[0]; // массив переменной длины должен быть последним.

};

  
// Распределение памяти и инициализация структуры

struct student *createStudent(struct student *s, int id, char a[])

{

    s = malloc( sizeof(*s) + sizeof(char) * strlen(a) );

      

    s->stud_id = id;

    s->name_len = strlen(a);

    strcpy(s->stud_name, a);

      

    s->struct_size = ( sizeof(*s) + sizeof(char) * strlen(s->stud_name) );

      

    return s;    

}

  
// Распечатать информацию о студенте

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); 

          

        // Значение Allocated_Struct_size здесь в байтах.

}

  
// Код драйвера

int main()

{

    struct student *s1, *s2;

      

    s1=createStudent(s1, 523, "Sanjayulsha");

    s2=createStudent(s2, 535, "Cherry");

      

    printStudent(s1);

    printStudent(s2);

      

    // размер в байтах

    printf("Size of Struct student: %lu\n", sizeof(struct student));

    // размер в байтах

    printf("Size of Struct pointer: %lu", sizeof(s1));

          

    return 0;

}

Выход:

Student_id : 523
Stud_Name : Sanjayulsha
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

Ссылки:
http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c
https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

Эта статья предоставлена Абхай Рати и Санджай Канна . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Массивы переменной длины в C и C ++

0.00 (0%) 0 votes