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 callocint *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);
|