Запись в файл при быстром выделении памяти - C (СИ)
Формулировка задачи:
Частичная задача программы заключается в записи в файл двухмерного массива символов.
Запись проводится следующим образом:
Я обнаружил, что значения массива можно вывести с помощью одного выражения без цикла:
Но мне осталось непонятным, почему, в случае, если я применяю для вывода значений цикл:
у меня отображаются на экране двухмерные массивы, каждый последующий из которых имеет на одну строку меньше.
Я понимаю, что нулевой элемент должен содержать память на все элементы массива. Но не понимаю, каким образом в нулевой элемент попали все элементы массива, ведь в нулевой элемент массива я записал лишь одну строку:
char **mass = (char **)calloc(ROWS,sizeof(int*));
*mass = (char *)calloc(COLUMNS*ROWS,sizeof(int));
for(i = 1; i < COLUMNS; i++)
{
*(mass+i) = *mass +i*ROWS;;
}for(i = 0; i < COLUMNS; ++i)
{
fread(mass[i],sizeof(char),ROWS,out);
fwrite(mass[i],sizeof(char),ROWS,in);
}fputs(mass[0], stdout);
for(i = 0; i < COLUMNS; ++i)
{
fputs(mass[i], stdout);
}fread(mass[i],sizeof(char),ROWS,out);
Решение задачи: «Запись в файл при быстром выделении памяти»
textual
Листинг программы
char **mass = (char **)calloc(ROWS,sizeof(int*)); *mass = (char *)calloc(COLUMNS*ROWS,sizeof(int));
Объяснение кода листинга программы
- В начале кода происходит выделение памяти для двумерного массива (массива указателей на массивы). Для этого используется функция calloc, которая выделяет память для заданного количества элементов (ROWS) указателей на массивы (sizeof(int)), а также для каждого из этих массивов (COLUMNSROWS элементов) с типом данных int.
- Затем, используя оператор *, полученный указатель на первый элемент массива (массив указателей на массивы) приводится к типу char**.
- Далее, используя оператор * и квадратные скобки, происходит запись в файл при быстром выделении памяти.