Инициализация динамического массива символов c в структуре typdef - PullRequest
1 голос
/ 27 марта 2020

Я определяю struct внутри заголовочного файла, который выглядит следующим образом:

#define BUFSIZE (500)

typedef struct container {
   int file_descriptor;
   char file_content[BUFSIZE];
}container;

Теперь я хочу иметь переменную BUFSIZE, чтобы общее количество символов, которое может содержать file_content, отражало который. Как я могу сделать file_content массив буферов символов переменного размера? Это может быть около 30-50KB. Если я инициализирую его размером 50 КБ, я получу ошибку переполнения стека.

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

A struct может иметь элемент гибкого массива в качестве последнего члена. В вашем случае это будет выглядеть так:

typedef struct container {
   int file_descriptor;
   char file_content[];
}container;

Размер struct равен (грубо говоря) размеру, в котором последний элемент был пропущен. Затем вы можете динамически выделить экземпляр этой структуры с таким количеством места, которое необходимо для последнего члена. Например:

container *mycontainer = malloc(sizeof(*mycontainer) + 50000);

Кроме того, поскольку размер структуры может варьироваться таким образом, он не может быть членом массива или другого struct или union.

2 голосов
/ 27 марта 2020

Вам нужно изучить динамическое использование памяти c и «mallo c» необходимую память.

Пример:

#define BUFSIZE (50*1024)  // 50KBytes.
int main(void)
{
    container my_container; // Error: Stack Overflow

    container*  correct_container = NULL;
    correct_container = malloc(sizeof(container)); // No StackOverflow: should succeed.

   correct_container->file_descriptor = get_fd();
   memset(correct_container->file_content, 0, BUFSIZE);

   // After usage is done.
   free(correct_container);
}
...