Динамички низови

Динамичка додела меморије омогућава рад са низовима управо онолике величине колико елемената је потребно да садрже датог момента. То је могуће захваљујући чињеници да показивач на неки тип података може да показује не само на меморијски простор величине једног таквог податка, већ на простор произвољне величине. Изразима адресне аритметике примењеним на показивач тај простор се издели на елементе величине једног податка посматраног типа. На пример са

int *p=malloc(n*sizeof(int));

добија се простор у који може да стане n целих бројева. Адреса појединих бројева може да се добије помоћу p+i, а њихове вредности са *(p+i). Према важећим еквиваленцијама између израза адресне аритметике и индексирања последњи израз може да се замени са p[i]. Према томе, додељени блок меморије може да се користи као низ од n елемената типа int.

Низови којима се меморија додељује динамички, називају се динамички низови. После доделе меморије, могу да се користе на исти начин као и „прави“ низови, тј. могу да се користе уобичајени индексни изрази уместо незграпних израза адресне аритметике. Једина разлика је у томе што се динамичким низовима величина одређује за време извршавања програма, а статичким низовима за време писања програма. Величина динамичких низова, после њиховог стварања, може и да се промени.

Пример 1. – разлика између malloc и calloc

#include <stdio.h>
#include <stdlib.h>
main()
{
int *m, *c, i, n;
printf("Unesi broj clanova niza : ");
scanf("%d", &n);
/* Niz m NE MORA garantovano da ima sve nule */
m = malloc(n*sizeof(int));
if (m == NULL) {
printf("Greska prilikom alokacije memorije!\n");
exit(1);
}
/* Niz c MORA garantovano da ima sve nule */
c = calloc(n, sizeof(int));
if (c == NULL) {
printf("Greska prilikom alokacije memorije!\n");
free(m);
exit(1);
}
for (i = 0; i<n; i++)printf("m[%d] = %d\n", i, m[i]);
for (i = 0; i<n; i++)printf("c[%d] = %d\n", i, c[i]);
free(m);
free(c);
}

Пример 2. Програм учитава низ целих бројева, а потом исписује елементе низа на стандарни излаз у обрнутом поретку, при чему се алокација меморијског простора за низ од н елемената врши динамички.
1) Треба алоцирати n * sizeof(T) бајтова, где је T тип елемената низа.
2) Повратну адресу malloc()-а треба претворити из void* у T*, како бисмо добили показивач који показује на први елемент низа типа T.
3) Надаље се елементима може приступати потпуно истоветно као да нам је дато име низа (које се и понаша као показивач на елемент типа T који је први у низу).

#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = NULL;
int i, n;
/* Unosimo dimenziju niza. Ova vrednost nije ogranicena bilo kakvom konstantom, kao sto je to ranije bio slucaj kada su nizovi bili alocirani staticki, pa je njihova dimenzija bila unapred ogranicena definisanim prostorom. */
printf("Uneti dimenziju niza: "); scanf("%d", &n);
/* Alociramo prostor za n celih brojeva */
p = (int *) malloc(sizeof(int) * n);
if (p  == NULL) { printf("malloc() greska!\n"); exit(1);}
/* Od ovog trenutka mozemo da koristimo pokazivac p kao da je ime niza, tj. i-tom elementu se moze pristupiti sa p[i] */
/* Unosimo elemente niza */
printf("Uneti elemente niza:\n");
for (i = 0; i < n; i++) scanf("%d", &p[i]);
/* Ispisujemo elemente niza unazad */
for (i = n - 1; i >= 0; i--) printf("%d ", p[i]);
printf("\n");
/* Oslobadjamo prostor */
free(p);
return 0;
}

Пример – збир елемената динамичког низа

#include<stdio.h>
#include<stdlib.h>
int main ()
{
int *pa, n, i, s;
while (1)
{
printf("n?"); scanf("%d",&n);
if (n<=0) break;
pa=malloc(n*sizeof(int)); /* dodela memorije */
if(pa==NULL){printf("greska");exit(1);}
printf("A?");
for(i=0;i<n;i++)scanf("%d",&pa[i]); /* upоtreba niza */
s=0;
for(i=0;i<n;i++)s=s+pa[i];
printf("s=%d\n",s);
free(pa); /* oslobadjanje memorije */
}
}
Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се /  Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се /  Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се /  Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се /  Промени )

w

Повезивање са %s