Alokacja struktury wewnątrz struktury

Odpowiedz Nowy wątek
2019-08-22 21:12
0
typedef struct {
    int *llst;
} arr2;

typedef struct {
    arr2 **table;
} arr;

arr *lista = (arr *)malloc(sizeof(arr));      // alokacja 1 strutury arr
lista->table = (arr2 **)malloc(sizeof(arr2)); // alokacja 2 struktury
int tablex[] = { 10 };                        // tablica z 1 elementem który ma być przypisany do struct arr2
lista->table[0] = (arr2 *)malloc(2);          // alokacja 2 tablicy czyli arr2
lista->table[0]->llst = tablex;               // przypisanie tablicy tablex do llst w struct 2 

Czy poprawnie alokuje pamięć?

edytowany 11x, ostatnio: wdfan, 2019-08-22 21:30

Pozostało 580 znaków

2019-08-22 21:27
kq
0

Jeśli to C++ to nie: https://dsp.krzaq.cc/post/176[...]xx-kiedy-uzywac-new-i-delete/

Poza tym, alokujesz błędne wielkości. Użyj std::unique_ptr i std::vector.


Pozostało 580 znaków

2019-08-22 21:29
0

Dopiero zaczynam właśnie z strukturami i co jakiś czas program potrafi scrashować i nadpisać pamięć innej zmiennej.
A jak mógłbym zaalokować pamięć w C? Głównie w tym staram się programować.

edytowany 1x, ostatnio: wdfan, 2019-08-22 21:29

Pozostało 580 znaków

2019-08-22 21:29
kq
1

W C jesteś zmuszony do użycia malloc lub podobnych jemu funkcji. Ale temat jest o C++, zgodnie z tagami.

Ok, to teraz:

// to jest ok (cast jest zbędny w C)
arr *lista = (arr *)malloc(sizeof(arr));      // alokacja 1 strutury arr
// błąd - alokujesz tablicę wskaźników, więc powinieneś alokować sizeof wskaźnika
lista->table = (arr2 **)malloc(sizeof(arr2)); // alokacja 2 struktury
// ok, ale to proszenie się o kłopoty na dłuższą metę
int tablex[] = { 10 };                        // tablica z 1 elementem który ma być przypisany do struct arr2
// malloc 2? błąd
lista->table[0] = (arr2 *)malloc(2);          // alokacja 2 tablicy czyli arr2
// ok, ale to proszenie się o kłopoty na dłuższą metę
lista->table[0]->llst = tablex;               // przypisanie tablicy tablex do llst w struct 2 

edytowany 1x, ostatnio: kq, 2019-08-22 21:32
Zmieniłem tagi :P - wdfan 2019-08-22 21:30
malloc(...) zwraca void *. Stąd że typ ten w C transparentnie rzutuje się do dowolnego innego wskaźnika, nie musisz (i nie powinieneś) rzutować wyniku malloc'a na typ docelowy. - Mokrowski 2019-08-22 22:42
Problem w tym, że Visual Studio się czepia i wywala błędy jeśli nie zacznę rzutować na docelowy typ chyba że zmienię na void*. - wdfan 2019-08-22 22:46
No to kompiluj w trybie C a nie w C++. To dla kompilacji w C++ powinieneś rzutować. Ustaw poprawnie kompilator. - Mokrowski 2019-08-22 22:48
Dla kompilacji w C++ to powinien nie używać malloca :​) - kq 2019-08-23 01:02
kompilatora nie trzeba przestawiać, trzeba zmienić nazwę pliku z domyślnego .cpp na .c - Azarien 2019-08-23 10:49

Pozostało 580 znaków

2019-08-22 21:38
0
    arr *lista = malloc(sizeof(arr));

    int tablex1[] = { 0, 1, 2, 3 };
    int tablex2[] = { 3, 2, 1, 0 };

    lista->table[0] = malloc(sizeof(tablex1) / sizeof(*tablex1));
    lista->table[0]->llst = tablex1;

    lista->table[1] = malloc(sizeof(tablex2) / sizeof(*tablex2));
    lista->table[1]->llst = tablex2;

Czyli mniej więcej tak? Staram się zrozumieć nigdy z strukturami nie miałem do czynienia. A o strukturach wewnątrz struktury nic nie znalazłem.

edytowany 2x, ostatnio: wdfan, 2019-08-22 21:39

Pozostało 580 znaków

2019-08-22 21:39
kq
0

Może napisz co chcesz osiągnąć, bo to co robisz niewiele ma sensu. Chyba że po prostu "ćwieczysz wskaźniki"


Pozostało 580 znaków

2019-08-22 21:41
0
typedef struct {
    void *ListaTablicy;
} Struktura2;

typedef struct {
    int LiczbaElementow;
    Struktura2**Tablica;
} Struktura1;

Mam taką strukture i nie moge jej zmieniać jedynie mam pisać na jej podstawie kod.
No i staram się zaalokować 1 strukturę i druga struktura jest tak jakby tablicą.
Po liczbie elementów wie ile razy ma odczytać 2 tablicę, druga tablica działa na podstawie pętli for i do niej wpisuje tablicę a raczej wskaźnij tej tablicy.

void ss(Struktura1 **tablica) {
    Struktura1 *lista = (Struktura1 *)malloc(sizeof(Struktura1));

    int tablica1[] = { 0, 1, 2, 3 };
    int tablica2[] = { 3, 2, 1, 0 };

        for (int i = 0; i <= 2; i++) {
          lista->Tablica[i] = (Struktura2 *)malloc(sizeof(tablica2) / sizeof(*tablica2));
          lista->Tablica[i]->ListaTablicy = tablica2;
       }
       *tablica = lista;
}
edytowany 6x, ostatnio: wdfan, 2019-08-22 21:51

Pozostało 580 znaków

2019-08-22 21:46
kq
0

ListaTablicy ma bardzo niejasną nazwę, co to ma być?

Jak to jakieś zadanie na studia czy coś to podaj jego treść


Pozostało 580 znaków

2019-08-22 21:48
0

To nie żadne zadanie, po prostu własny projekt.
ListaTablicy tutaj ma alokować pamięć i przypisywać tablicę ale ma być widoczna globalnie?

lista->Tablica; Tego nie trzeba zaalokować jeśli ma przypisać 2 tablice? Jeśli przypisuję do niego elementy.

Przy wywołaniu funkcji ss ma dostęp do tych dwóch tablic; pod tą strukturą.

edytowany 5x, ostatnio: wdfan, 2019-08-22 21:52

Pozostało 580 znaków

2019-08-22 22:06
kq
0

Jak własny projekt to dlaczego nie możesz zmienić?

Mam taką strukture i nie moge jej zmieniać jedynie mam pisać na jej podstawie kod.

Ta struktura nie wydaje się mieć sensu z Twojego opisu. Opisz słownie co chcesz/masz zrobić.


Pozostało 580 znaków

2019-08-22 22:13
0

Po prostu nie moge jej zmienić struktura tak musi wyglądać.
Mi bardziej zależy żeby nie było wycieków pamięci i czy poprawnie alokuję pamięć do tej okropnej struktury.
Wskaźników tyle ma być :P

Po prostu ma te 2 tablice wrzucić do tej Struktury2 a ma być ona widoczna z Struktury1 nie wiem jak to łatwiej wytłumaczyć
Ilość tablic zna poprzez Strukture1 bo do niej zapisuje ile ich zapisał do Strutura2.

edytowany 3x, ostatnio: wdfan, 2019-08-22 22:15

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0