Riešenia


Úloha 1
 
Prvá funkcia:

int *AlokujPole(int n)
{
	int *p;

	if ((p = (int*)malloc(n * sizeof(int))) == NULL) {
		printf("Chyba! Malo pamate!\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 pamate!\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 pamate!\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 pamate!\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á tri 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]);
	}
}