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