Új hozzászólás Aktív témák

  • G.A.

    aktív tag

    Üdv!

    8Bites mikróvezérlőhöz írogatok kódot, amit VS 2015-ben (C++) tesztelek.
    A vezérlőre írt kódot C-ben írom, de a teszthez használt segédfunkciókhoz C++-t is használok.

    A probléma:
    globális struktúra (pontosabban union) tömböt(pointert?) szeretnék funkcióval manipulálni (méret megadása, adatokkal feltöltés)

    Kódban kifejezve:

    typedef union dns_answer
    {
    struct
    {
    my_16b name;
    my_16b type;
    my_16b rrs_class;
    my_32b ttl;
    my_16b rd_length;
    my_32b data;
    };
    u8b b[16];
    }dns_answer;

    void function(u8b data[], dns_answer** answer)
    {
    dns_answer local_answer;
    *dns_response = (dns_answer*)malloc(data[7] * sizeof(dns_answer));

    for(u8b i = 0; i < data[7]; i++)
    {
    for (u8b x = 0; x < 4; x++)
    {
    local_answer.data.b[x] = data[x];
    //*dns_response[i].data.b[x] = data[x];
    }
    *dns_response[i] = local_dns_resp; // HIBA ITT
    }
    }

    dns_answer* answer_array = NULL;
    u8b data[512] = {};

    int main(void)
    {
    ...
    function(data, &answer_array);
    ...
    }

    Ezzel a kóddal jelenleg az a problémám, hogy:
    Ha érkezik egy adatcsomag(DNS üzenet), ahol több válasz van (data[7] > 1), akkor a jelölt helyen (HIBA ITT)
    áll meg a kód... Hibaüzenet: Access violation writing location 0x00000000

    Ha jól értem olyan címre akar írni, ami nem létezik. A hiba eredetét a malloc()-ra tippelem. Következtetésem az, hogy ha kihagyom a function()-ban a malloc()-ot és az inicializáláskor az int main() előtt megadom a tömb méretet, akkor nincs ez a hiba.
    Hogyan méretezhetném újra a struktúra tömbömet (dns_answer* answer_array) a funkción belül, úgy hogy az globálisan is megvalósuljon?

    illetve., hogy kerülhetném ki a function()-ban az átmeneti lokális struktúra használatát?

Új hozzászólás Aktív témák