warum stürzt das prog ab?



  • also, ich hab mir überlegt dafür doch nen neuen thread zu starten:

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int *p = new int[5];
        p[0] = 32;
        p[1] = 7;
        int **q = new int*[5];
    
        //q[0] = p;
        //cout << **q << endl;
        //q[0] = &p[1];
        //cout << **q << endl;
        *q[0] = p[1]; //absturz wenn oberes weg ist sonst '7' ??
        cout << **q << endl;
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    das pog(bsp) stüzt ab wenn ich die zeilen auskommentiert lasse, wenn nicht zeigt es '7' an???

    dann noch ne frage dazu:

    int pq[3][3];
        int pr[3] = {9,2,3};
    
        *pq[0] = *pr; //zeigt leider nur auf anfang des array
    
        cout<<pq[0][0];
    

    kann ich ein array in ein 2d-array packen ohne erst langsam umzukopieren?
    leider funzt oberes bsp. nicht, da man natürlich nicht mit

    cout<<pq[0][1];
    

    ne '2' herausbekommen kann. s.o.



  • dgrat schrieb:

    dann noch ne frage dazu:

    int pq[3][3];
        int pr[3] = {9,2,3};
        
        *pq[0] = *pr; //zeigt leider nur auf anfang des array
        
        cout<<pq[0][0];
    

    kann ich ein array in ein 2d-array packen ohne erst langsam umzukopieren?
    leider funzt oberes bsp. nicht, da man natürlich nicht mit

    cout<<pq[0][1];
    

    ne '2' herausbekommen kann. s.o.

    Wie willst du es denn ohne kopieren machen?
    Mit kopieren kannst du z.B. soetwas machen:

    template <class T>
    void vec_cpy(T* to, const T* from, size_t count)
    {
            for(size_t i = 0; i < count; ++i)
                    to[i] = from[i];
    }
    

    (Diese simple Lösung basiert darauf, dass ein Array immer hintereinander im Speicher liegt weshalb z.B. int my_multi_vec[x][y][z] äquivalent zu int my_multi_vec[x * y * z] ist...)

    Aufrufen tust du vec_cpy() auf dein Beispiel bezogen folgendermaßen:

    // kopiert 3 Werte aus pr nach &pq[0][0]..
    vec_cpy(&pq[0][0], &pr[0], 3);
    

    Caipi



  • thx erstmal, weiß nun noch jemand wieso obiges bsp. absturze verursacht?



  • Du dereferenzierst einen uninitialisierten Zeiger (q[0]).



  • wiee meinst du das? könntest du zeigen wie das richtig aussehen muss?



  • dgrat schrieb:

    wiee meinst du das? könntest du zeigen wie das richtig aussehen muss?

    Also du hast einen Vektor aus Zeigern auf ints int** q = new int*[5];. Auf diese Int-Zeiger kannst du jetzt in gewohnter "Array-Manier" zugreifen. Das sollte soweit alles klar sein.
    Der Haken an der Sache ist jedoch dieser, dass lokale Variablen einen uninitialisierten Anfangswert haben, konkret für deine 5 Int-Zeiger bedeutet das, dass sie auf irgendeine Stelle im Speicher zeigen. D.h. an dieser Stelle kann das OS zu diesem Zeitpunkt z.B. sehr wichtige Daten speichern.

    Wenn du an diese Stelle einen anderen Wert hinschreibst (Was du mit der Dereferenzierung erreichst), kann es schon einmal krachen.

    Wenn du die obigen 5 Zeilen wieder 'einkommentierst', crasht es nicht, da der Zeiger q[0] jetzt auf einen gültigen Speicherbereich zeigt. (Diesen weißt du ihm durch die Zeile
    q[0] = p; zu).

    Caipi



  • achso 🙂 jetzt hab ichs verstanden


Anmelden zum Antworten