Wpisanie zmiennych do wskaźnika

0

Witam ma problem z programem. Po wpisaniu jednego z kilku punktów program się wyłącza. Dopiero zacząłem ze wskaźnikami.

 #include <iostream>

struct points {
    char *letter;
    int *A;
    int *B;
};

void comparison (points &tabPoints);

int main()
{
    int step = 0;
    int howManyPoints = 0;
    int index = 0;
    std::cin >> step >> howManyPoints;
//    std::cout << step << howManyPoints << std::endl;
    points * tabPoints = new points [howManyPoints];

    while (step != 0) {
//        std::cout << "robi " << std::endl;
        while (howManyPoints != 0) {
            std::cin >> *tabPoints[index].letter >> *tabPoints[index].A >> *tabPoints[index].B;
            ++index;
            --howManyPoints;
        }
        --step;
    }
    size_t size = (sizeof (tabPoints)/sizeof (tabPoints[0]));
    std::cout << size << std::endl;
    for (int i = 0 ; i < size ; ++i) {
        std::cout << *tabPoints->letter << *tabPoints->A << tabPoints->B << std::endl;
    }

    delete [] tabPoints;
    return 0;
}

void comparison (points &tabPoints) {

}

1

Wskaźnik to nie tablica. Wskaźnik nie alokuje pamięci dla zmiennej, na którą wskazuje.

char *letter;

Masz wskaźnik. Tylko tyle. Nie masz pamięci do przechowywania zmiennej o typie char.
Już nie wspominając o tym, że nie inicjalizowałeś tego wskaźnika, więc nie wiadomo gdzie wskazuje i próba odczytu tego adresu *tabPoints[index].letter to jest to samo co próba odczytu niezainicjalizowanej zmiennej, czyli UB.

1

@87kelthuzad: uważam, że trochę się zapędziłeś, ponieważ obiekty wewnątrz struktury w ogóle nie muszą być wskaźnikami. Tylko niepotrzebnie komplikujesz sobie życie.

0

ok czyli jeszcze muszę mieć zmienne do tych wskaźników. Wiem że komplikuje ale inaczej to wskaźników nigdy się nie naucze.

2

Nie możesz wstawiać wartości do gołych wskaźników tak jak to robisz. Musisz najpierw zaalokować na stercie pamięć dla obiektu z wykorzystaniem operatora new np." int wsk* = new int; I tak dla każdego z obiektów wewnątrz tej struktury. Dopiero po tej operacji będziesz mógł przypisywać tym zmiennym wartości na końcu dealokując pamięć z użyciem delete.

0

to jeszcze mam jedno pytanie tym razem do delete. Gdzie je wstawić w struct nie działa i przed końcem programu też n ie działa.

#include <iostream>

struct points {
    char * letter = new char;
    int *A = new int;
    int *B = new int;
    //delete [] letter;
};

void comparison (points &tabPoints);

int main()
{
    int step = 0;
    int howManyPoints = 0;
    int index = 0;
    std::cin >> step >> howManyPoints;
//    std::cout << step << howManyPoints << std::endl;
    points * tabPoints = new points [howManyPoints];

    while (step != 0) {
//        std::cout << "robi " << std::endl;
        while (howManyPoints != 0) {
            std::cin >> *tabPoints[index].letter >> *tabPoints[index].A >> *tabPoints[index].B;
            ++index;
            --howManyPoints;
        }
        --step;
    }
    size_t size = (sizeof (*tabPoints)/sizeof (tabPoints[0]));
    std::cout << size << std::endl;
    for (int i = 0 ; i < size ; ++i) {
        std::cout << *tabPoints->letter << " " << *tabPoints->A << " " << *tabPoints->B << std::endl;
    }
    
    //delete [] letter;
    delete [] tabPoints;
    return 0;
}

void comparison (points &tabPoints) {

}
 
2

W destruktorze struktury zastosuj delete usuwający ze sterty zaalokowane dynamicznie obiekty. Jak tak zrobisz to zyskasz swego rodzaju automat, który posprząta obiekty wewnątrz struktury kiedy ta, nazwijmy to "przestanie być potrzebna":

~points() { /* i tutaj usuwaj... */ }

0

I jeszcze jedno jak teraz wywołać taki destruktor bo nie wiem czy linijka points * tabPoints = new points [howManyPoints]; odpowiada za stworzenie obiektu tak jak to ma miejsce w klasach. u mnie struktura wygląda tak:

struct points {
    char * letter = new char;
    int *A = new int;
    int *B = new int;

    ~points() {
        delete letter;
        delete A;
        delete B;
    }
}; 

i teraz destruktor zrobiłem tak

tabPoints->~points(); 
1

tabPoints->~points(); nigdy w życiu tak nie rób! Destruktor zostanie wywołany samoczynnie: https://ideone.com/Oij0Cp

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