Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C/C++ dynamická alokace paměti

Zdravím,

potřeboval bych od Vás trochu objasnit problematiku týkající se dynamického (rostoucího) pole a s tím související dynamickou alokaci paměti - malloc, realloc, případně new v C++ apod. Jde o to, že ve všech návodech, videích apod je ten postup prakticky totožný ->

1. vytvořím si pole na haldě o nějaké velikosti např. int* heapArray = (int*) malloc(3 sizeof(*heapArray));
2. poté, až kapacita tohoto pole nebude dostačovat, tak se použije realloc (data zůstanou, velikost pole se zvětší - většinou např. 2x)
3. v C++ jelikož realloc není, tak se to buď řeší buď přímo zabudovaným vectorem a nebo vytvořením druhého většího pole a zkopírováním hodnot z prvního do tohoto nově vytvořeného pole.
4. to vše samozřejmě ideálně zakomponovat do nějaké struktury která bude obsahovat další proměnné, jako kapacita, velikost apod...

Dynamické pole jsem podle kódů z návodů pochopil, ale trochu jsem si s tím hrál a vůbec jsem nepobral pár věcí. Na tyto věci (celkově 2) se ptám přímo v komentářích v první části kódu kódu - příšlo mi to přehlednější, než to vypisovat sem.

první a druhá část je oddělena hvězdičkami

v druhé části jsem se bez nutnosti používat realloc nebo vytvoření druhého pole snažil vytvořit primitivní dynamicky rostoucí pole a zdá se, že vše funguje (žádný problém jsem nezaznamenal).


#include <stdio.h>
#include <stdlib.h>

int main()
{
    // alokace pole na haldě
    int* heapArray = (int*) malloc(sizeof(*heapArray)); // nebo v C++ int* heapArray = new int;
    heapArray[0] = 0; // *(heapArray) = 0;
    heapArray[1] = 1; // *(heapArray + 1) = 1;
    heapArray[2] = 2; // *(heapArray + 2) = 2;

    //v pořádku
    printf("%d ", heapArray[0]);
    printf("%d ", heapArray[1]);
    printf("%d \n", heapArray[2]);

    printf("%p ", &heapArray[0]);
    printf("%p ", &heapArray[1]);
    printf("%p \n", &heapArray[2]);

    //jakou hodnotu má dalších 7 políček a existují vůbec?
    heapArray[10] = 500;

    //pointerová aritmetika funguje
    printf("%d ", *(heapArray+10));
    printf("\n");

    /*pokud funguje kód výše proč bych vůbec při alokaci pole měl udávat počet políček?
    int* heapArray = (int*) malloc(pocet_policek * sizeof(*heapArray)); ? */

    //*******************************************************************************//

    int* heapArray2 = (int*) malloc(sizeof(*heapArray2));
    int velikost_pole = 0;

    printf("zadej pocatecni velikost pole: ");
    scanf("%d", &velikost_pole);

    //počáteční velikost
    for(int x  = 0; x < velikost_pole; x++){
        heapArray2[x] = x;
    }

    for(int x  = 0; x < velikost_pole; x++){
        printf("%d ", heapArray2[x]);
    }

    printf("\n");

    //rozšíření pole
    for(int x  = velikost_pole; x < velikost_pole*2; x++){
        heapArray2[x] = x;
    }

    for(int x  = velikost_pole; x < velikost_pole*2; x++){
        printf("%d ", heapArray2[x]);
    }

    printf("\n");

    //vypsání celého pole
    for(int x  = 0; x < velikost_pole*2; x++){
        printf("%d ", heapArray2[x]);
    }

    free(heapArray2);

    return 0;
}

Jelikož jsem na internetu nic podobného nenašel, tak jsem se rozhodl zeptat se zde vás.
Buď to funguje, protože to prostě fungovat může a není to spatně, a nebo je to totálně celé špatně, ale funguje to (vím, že tohle se u C/C++ stát může) :D.

Odpověď na otázku

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny