Alokacja struktury wewnątrz struktury

Alokacja struktury wewnątrz struktury
WD
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:6
0
Kopiuj
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
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
0

Jeśli to C++ to nie: https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

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


WD
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:6
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
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
1

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

Ok, to teraz:

Kopiuj
// 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
Zobacz pozostały 1 komentarz
MO
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.
WD
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*.
MO
No to kompiluj w trybie C a nie w C++. To dla kompilacji w C++ powinieneś rzutować. Ustaw poprawnie kompilator.
kq
Dla kompilacji w C++ to powinien nie używać malloca :​)
Azarien
kompilatora nie trzeba przestawiać, trzeba zmienić nazwę pliku z domyślnego .cpp na .c
WD
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:6
0
Kopiuj
	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
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
0

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


WD
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:6
0
Kopiuj
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.

Kopiuj
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
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
0

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

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


WD
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:6
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
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
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ć.


WD
  • Rejestracja:ponad 5 lat
  • Ostatnio:ponad 5 lat
  • Postów:6
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
tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
2
wdfan napisał(a):

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

wdfan napisał(a):

To nie żadne zadanie, po prostu własny projekt.

WTF?


"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter
Zobacz pozostały 1 komentarz
tajny_agent
Więc nasuwa się pytanie, po co sobie na siłę utrudniać :> Nie możesz tego napisać w C++?
WD
Przyzwyczajenie (głownie przez mały rozmiar pliku wynikowego), no i ogólnie polubiłem C nie polubiłem się z objektowością.
tajny_agent
Ale pisanie w C++ wcale nie wymusza pisania OOP. Byłoby łatwiej coś podpowiedzieć gdybyś przedstawił kontekst, bo póki co to walczysz z samym językiem a nie z problemem
WD
Kompilator mam ustawiony w C++, wiem, że mozna pisać w C++ i pisać kod w C.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 5 godzin
2

Jeśli chcesz pisać w C, to nie kompiluj tego jako C++.
Zmień nazwę pliku żeby miał rozszerzenie .c

edytowany 1x, ostatnio: Azarien

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.