Riešenia


Úloha 1

Prvá funkcia:

int *AlokujPole(int n)
{  
   int *p;
   
   if ((p = (int*)malloc(n*sizeof(int))) == NULL){
     printf("Chyba! Malo pamati!\n") ;
     exit(1)  
   }
   else return(p); 
}
V druhej funkcii môžeme pri alokovaní pamäte pre pole využiť funkciu calloc

int *AlokujPole(int n)
{  
   int *p;
   
   if ((p = (int*)calloc(n, sizeof(int))) == NULL){
     printf("Chyba! Malo pamati!\n") ;
     exit(1)  
   }
   else return(p); 
}

Úloha 2

double **AlokujPole2d(int x, int y)
{  
   double **p;
   int i;
   
   /* najskor alokujme pole pointerov na riadky dvojrozmerného poľa*/
   if ((p = (double**)malloc(x*sizeof(double*))) == NULL){
     printf("Chyba! Malo pamati!\n") ;
     exit(1)  
   }
   /* teraz možeme alokovať pamäť pre jednotlivé riadky poľa */
   for (i = 0; i < y; i++){
     if ((p[i] = (double*)malloc(y*sizeof(double))) == NULL) {
       printf("Chyba! Malo pamati!\n") ;
       exit(1)  
     }
   }    
   
   return(p);
}


Úloha 3

1. spôsob:  a[1]
2. spôsob:  *(a+1)


Úloha 4

1.  sizeof(x) == 10*sizeof(int) t.j. takto získame veľkosť celého poľa
2.  sizeof(p_x) == sizeof(int*) t.j. takto získame veľkosť pointera (adresy)

Ak potrebujeme v programe zistiť počet prvkov statického poľa, vhodným riešením je použitie makra:

#define pocet(pole) (sizeof(pole)/sizeof(pole[0]))


Úloha 5

V programe je jedna chyba:

int main(void)
{
   double *p = malloc(3*sizeof(double));
   p = p + 3;  naše pole má 3 prvky! p + 3 by bola adresa štvrtého
   *p = 3.14;  zapisujeme do pamäte, ktorá nám nepatrí!
   printf("%f", *p);
   return(0);
} 


Úloha 6

a)  char s1[10];statické pole majúce 10 znakov t.j. statický reťazec
Pozor! Najdlhší reťazec, ktorý môže byť do tohto poľa uložený, môže mať 9 znakov. Posledný znak reťazca má index 8, prvok s1[9] je ukončovací znak '\0', prvok s indexom 10 už neexistuje.

b)  char *s2 = (char*)malloc(10);dynamický reťazec (až na spôsob alokácie úplne rovnocenný s reťazcom s1)

c)  char s3[] = "Ahoj"; Statický raťazec môžeme hneď inicializovať reťazcovou konštantou. Ak nezadáme počet prvkov poľa, prekladač to urobí za nás - alokuje pamäť potrebnú práve na uloženie daného reťazca, znak '\0' tiež doplní sám.

d)  char *s4 = "Nazdar";s4 nie je dynamický reťazec! V tomto prípade predstavuje pointer na char, ktorý sme inicializovali adresou reťazcovej konštanty obsahujúcej Ahoj. Pre túto reťazcovú konštantu prekladač vyhradil miesto v dátovom segmente. Žiadna dynamická alokácia sa tu nerealizuje!

Ak potrebujeme pracovať s dynamickými reťazcami, dobré je postupovať takto:

typedef char* STRING;

STRING ret;
ret = (char*)malloc(10);
strcopy(ret, "Ahoj");
printf("%s", ret);


Úloha 7

Na obrazovku sa vypíše: UHO

Vysvetlenie: Na začiatku pointer p ukazuje na prvý znak reťazcovej konštanty "VIP". Pointer sa posúva po znakoch, ak ukazuje na ukončovací znak '\0' t.j. *p je false, ďalšie opakovanie cyklu sa už neuskutoční.


Úloha 8

#include <stdio.h>

void main(int argc, char *argv[])
{
   int i;

   printf("Program %s bol spusteny s tymito parametrami:\n", argv[0]);
   for (i = 1; i<argc; i++){
      printf("Parameter &d : %s\n", i, argv[i]);
   }
}