Динамическое выделение памяти под массив - C (СИ) (75349)
Формулировка задачи:
Доброго времени! Требуется ввести размер массива с клав-ры, заполнить массив - изменить его размер (вдвое меньше - значит половина элементов должна сохранить прежнее значение).
Проблема в том, что старое значение хранят в себе только первые 2-3 элемента, независимо от размера массива.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void cal(int);
int main()
{
int siz;
srand(time(NULL));
printf("Enter array-size -> ");
scanf("%d", &siz);
cal(siz);
return 0;
}
void cal(int siz)
{
int *ar=calloc(siz, sizeof(int));
int j;
printf("\narray -> ");
for(j=0; j<siz; j++)
printf("%d ", ar[j]=rand()%50);
siz/=2;
ar=realloc(ar, siz);
printf("\n1/2 array -> ");
for(j=0; j<siz; j++)
printf("%d ", ar[j]);
putchar('\n');
return;
}Решение задачи: «Динамическое выделение памяти под массив»
textual
Листинг программы
int size;
int arr = NULL, arr_tmp = NULL;
// получаем size
arr = malloc(size * sizeof(*arr));
// меняем size
arr_tmp = realloc(arr, size * sizeof(*arr));
if (NULL != arr_tmp) {
arr = arr_tmp;
arr_tmp = NULL;
}
Объяснение кода листинга программы
- Объявлены две переменные:
sizeиarr. Значение переменнойsizeне определено, а переменнаяarrинициализирована значением NULL. - Выделена динамическая память под массив с помощью функции malloc(). Размер памяти вычисляется как произведение
sizeна размер одного элемента (предполагая, чтоsizeуже определено). - Значение переменной
arrзаменено на выделенную память. - Выделенная память освобождена с помощью функции realloc(). Значение переменной
arr_tmpинициализировано результатом вызова функции realloc(). - Если переменная
arr_tmpне равна NULL, то значение переменнойarrзаменено на значениеarr_tmp. После чего переменнаяarr_tmpинициализирована значением NULL. - В конце кода значение переменной
arrбудет содержать выделенную память под массив.