Динамическое выделение памяти для массива - C (СИ)
Формулировка задачи:
Есть лаба, задание скриншотом ниже. Я вроде бы как сделал его, но вот второй массив который я использую что бы не терять данные с предыдущего нужно задавать вручную. Можно как то сделать, что бы и его размер изменялся в зависимости от кол-ва элементов.
int main() {
int *a = 0;
int *b = 0;
int n = 0, count = 1, t = 0;
b = (int*)malloc(count * sizeof(int)); //Тот самый массив
while (1)
{
printf("\nEnter Integer Number: ");
scanf("%d", &n);
if (n > 0)
{
free(a);
a = (int*)malloc(count * sizeof(int));
a[t] = n;
b[t] = a[t];
count++;
t++;
}
else
{
free(a);
free(b);
break;
}
}
}Решение задачи: «Динамическое выделение памяти для массива»
textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int *a = NULL, *b = NULL;
int x = 1, n = 0, i;
while (1)
{
scanf("%d", &x);
if (x < 0) break;
b = malloc( (n+1) * sizeof(*a) );
memcpy(b, a, n*sizeof(*a));
free(a);
a = b;
b = NULL; // на всякий случай
a[n++] = x;
}
printf("n = %d\n", n);
for (i=0; i<n; i++)
printf("%d ", a[i]);
free(a);
return 0;
}
Объяснение кода листинга программы
В этом коде происходит динамическое выделение памяти для массива.
- Сначала объявляются две переменные типа int, которые будут использоваться как указатели:
aиb. Изначально обе они равны NULL. - Затем объявляется переменная
x, которая будет использоваться для чтения значений из стандартного ввода. - Далее объявляется переменная
n, которая изначально равна 0 и используется для отслеживания количества элементов в массиве. - Затем начинается цикл while, который продолжается до тех пор, пока
xне станет отрицательным. - Внутри цикла
bдинамически выделяется память с помощью функцииmalloc(). Размер памяти, который нужно выделить, увеличивается на 1 каждый раз, чтобы учесть новый элемент. - Затем содержимое
aкопируется вbс помощью функцииmemcpy(). Это делается для того, чтобы при измененииaне изменялся исходный массив. - После этого
aосвобождается с помощью функцииfree(). aиbменяются местами, иbосвобождается.- Новый элемент добавляется в массив
aс помощьюa[n++] = x;. - После выхода из цикла, выводится количество элементов в массиве с помощью
printf(n = %d\n, n);. - Затем с помощью цикла for выводятся все элементы массива.
- Наконец,
aосвобождается с помощьюfree(a);, и функция main() возвращает 0, указывая на успешное выполнение.