Изменение размера массива по ходу программы - C (СИ)
Формулировка задачи:
Доброго дня.
Надо изменять размерность массива по ходу выполнения программы.
Хотел, по наивности, сделать так:
,
где /// - опущенные ненужные строки кода.
Но не прокатило.
Подсказали про функции malloc, realloc и free.
Но компилятор даёт кучу ошибок (см. вложение), когда я пытаюсь состряпать хотя бы создание массива.
Пробовал так:
Если кому не трудно, то напишите, пожалуйста:
а) как правильно создать нужный массив;
б) как правильно изменить его размерность.
volatile uint16_t testarray[1];
int main(void)
{
///
if ( param = 1 )
{
testarray[20];
}
else if ( param = 0 )
{
testarray[1];
}
///
}volatile uint16_t *testarray; testarray = (uint16_t *) malloc (sizeof (uint16_t) * 20);
Решение задачи: «Изменение размера массива по ходу программы»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
// old_size - старый размер
// new_size - новый размер
int* Resize(int *Arr, int old_size, int new_size)
{
int i,k;
k=(old_size<new_size)?old_size:new_size;
int *r=calloc(new_size,sizeof(int));
for (i=0; i<k; i++) r[i]=Arr[i];
free(Arr);
return r;
}
int main(int argc, char *argv[])
{
int *A;
int i;
A=calloc(20,sizeof(int)); // массив из 20 эл-тов
for (i=0; i<20; i++) A[i]=i; // заполняем
printf("Initial Arr="); // печатаем
for (i=0; i<20; i++) printf(" %d",A[i]);
printf("\n");
A=Resize(A,20,30); // ресайзируем
printf("After resizing ="); // печатаем
for (i=0; i<30; i++) printf(" %d",A[i]);
printf("\n");
free(A); // удаляем
system("PAUSE");
return 0;
}
Объяснение кода листинга программы
- Объявлены две функции:
Resizeиmain. - В функции
Resizeопределены три переменные:i,k,r. Значениеkбудет использоваться для контроля цикла. - Значение
new_sizeпроверяется на максимальное значениеold_size, чтобы избежать переполнения. - Выделен новый массив
rс помощью функцииcalloc. - В цикле копируются элементы из старого массива
Arrв новый массивr. - Функция
freeиспользуется для освобождения памяти, выделенной для старого массиваArr. - Возвращается адрес нового массива
r. - В функции
mainобъявлены две переменные:Aиi. - Выделен массив
Aс помощью функцииcallocразмером 20 элементов. - В цикле заполняются элементы массива
Aзначениями от 0 до 19. - Выводится сообщение
Initial Arr=и значения элементов массиваA. - Массив
Aпередается в функциюResizeдля изменения размера. - Выводится сообщение
After resizing =и значения элементов нового массиваA. - Массив
Aосвобождается с помощью функцииfree. - Запускается команда
PAUSEдля приостановки выполнения программы. - Возвращается значение 0, указывающее на успешное выполнение программы.