IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Dynamická alokace, dealokace 2D pole ve funkci

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Adam
Člen
Avatar
Adam:29.10.2021 11:59

Zdravím, měl bych dotaz ohledně dynamické alokace, dealokace 2D pole ve funkci. Program kompiluju pomocí gcc main.c -o main -fsanitize=address. Při spuštění fsanitizer hlásí chybu přetečení a zajímal by mě důvod kde. Budu rád za každou užitečnou radu.

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

void allocate_2D(int*** p, int r, int s) {
    *p = malloc(sizeof(int*) * r);
     for(int i = 0; i < r; i++) {
        *p[i] = malloc(sizeof(int) * s);
    }
    return;
}

void free_2D(int*** p, int r) {
    for(int i = 0; i < r; i++) {
        free(*p[i]);
    }
    free(*p);
    *p = NULL;
}

int main() {
    int r = 5, s = 5;
    int** p_a;

    allocate_2D(&p_a, r, s);
    free_2D(&p_a, r);

    return 0;
}

Zkusil jsem: Vše

Chci docílit: Funkční program bez chyb

 
Odpovědět
29.10.2021 11:59
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Adam
DarkCoder:29.10.2021 12:55

Důvodem je priorita operátorů. Operátor indexace [] má vyšší prioritu nežli operátor dereference *. Tedy ukazatel na pole (*p)[] vs pole ukazatelů *p[].

void allocate_2D(int*** p, int r, int s) {
    *p = (int**)malloc(sizeof(int*) * r);
     for(int i = 0; i < r; i++) {
        (*p)[i] = (int*)malloc(sizeof(int) * s);
    }
}

void free_2D(int*** p, int r) {
    for(int i = 0; i < r; i++) {
        free((*p)[i]);
    }
    free(*p);
    *p = NULL;
}
Nahoru Odpovědět
29.10.2021 12:55
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.