Глобальный динамический двумерный массив - C (СИ)
Формулировка задачи:
Вообщем есть задача считать файл в функции init(), а массивы строк получившиеся в итоге объявить так чтоб они были доступны глобально.
Как объявить глобально text_array я ума не приложу, помогите пожалуйста.
void init ()
{
size_t stringf;
FILE *file_name;
stringf=0;
file_name = fopen ("/home/test.txt","r");
while(fscanf(file_name, "%*[^\n]%*c") != EOF)
stringf++;
char text_array[(stringf+1)][128];
file_name = freopen ("/home/test.txt","r",file_name);
do {
stringf--;
fgets ((text_array[stringf]),128,file_name);
}while (stringf != 0);
fclose (file_name);
}
int main()
{
init();
printf ("%s",text_array[0]);
return 0;
}Решение задачи: «Глобальный динамический двумерный массив»
textual
Листинг программы
#include <stdlib.h>
char** allocate_text_array(size_t nString)
{
char **text_array;
text_array = malloc( nString * sizeof(char*) );
for (size_t i = 0; i < nString; i++)
text_array[i] = malloc(128*sizeof(char));
return text_array;
}
void free_text_array(char **text_array)
{
for (size_t i = 0; i < nString; i++)
free(text_array[i]);
free(text_array);
}
int main()
{
size_t nString;
// читаем nString из файла
// выделяем память под двумерный массив
char **text_array = allocate_text_array(nString);
// работаем с массивом text_array
some_function_that_use_text_array(text_array, nString);
// освобождаем память
free_text_array(text_array);
}
Объяснение кода листинга программы
- В функции
allocate_text_arrayмы объявляем двумерный массивtext_arrayтипаchar*и выделяем память под него с помощью функцииmalloc. - Затем мы проходим циклом по всем строкам массива и выделяем память под каждую строку с помощью функции
malloc. - В функции
free_text_arrayмы освобождаем память, сначала пройдя циклом по всем строкам массива и освободив память с помощью функцииfree, а затем освобождаем память под самим массивомtext_array. - В функции
mainмы объявляем переменнуюnString, которая представляет собой количество строк в нашем массиве. - Мы считываем значение
nStringиз файла. - Затем мы выделяем память под двумерный массив
text_arrayс помощью функцииallocate_text_array. - Мы выполняем некоторую функцию
some_function_that_use_text_array, которая работает с массивомtext_array. - После того, как мы закончили работу с массивом, мы освобождаем память с помощью функции
free_text_array.