Pointer und Funktionen



  • Hallo,

    ich versuche mich gerade an einer eigentlich simplen Funktion die die Differenz von zwei Arrays im Sinne der Subtraktion von Mengen realisiert. Dabei habe ich ein paar Probleme mit Pointer als Rückgabeargument von Funktionen. Zum einen, verstehe ich folgendes nicht:

    // test.cpp
    // Dev-C++ 4.992 under winXP
    
    void somefunc(){
         int* ip;
         *ip = 5; //error! warum? Zuordnung mit new?
    }
    
    int main()
    {
        somefunc();
         int* ip;
         *ip = 5; //geht manchmal! warum?
    }
    

    Zum anderen weiß ich nicht wie ich die Rückgabe machen soll. Hier die ganze Funktion:

    int* minarray(int* array, int* minus, int sizea, int sizeb){
         // vectoren aus arrays erstellen
         vector<int> a;
         for (int i = 0; i < sizea; i++) {
             a.push_back(array[i]);
         }
    
         vector<int> b;
         for (int i = 0; i < sizeb; i++) {
             b.push_back(minus[i]);
         }
    
         vector<int>::iterator Iter, result;
    
         vector<int> intersect;
    
         // Differenz bilden
         for (Iter = b.begin();Iter != b.end(); Iter++) {
             result = find(a.begin(), a.end(), *Iter);  
             if (result != a.end()) {
                intersect.push_back(*result);
             }
         }
    
         // neues array erstellen
         int* newarr = new int[a.size()];
         int count = 0;
         for (Iter = intersect.begin();Iter != intersect.end(); Iter++){
             newarr[count] = *Iter;
             //printf("i: %i %i\n", count, newarr[count]);
             count++;
         }  
    
         return newarr;
    }
    

    Bei der Rückgabe bekomme ich nicht die richtige Größe des Arrays:

    int a[] = {1, 14, 44, 89};
        int b[] = {14, 44, 17};
        int* c = minarray(a, b, 4, 2);
        int length = sizeof(c)/sizeof(*c);
        printf("length: %i\n", length);
        for (int i = 0; i < 12; i+=sizeof(*c)) {
            printf("%i\n", c[i]);    
        }
        //output
        //14
        //197121
        //2609
    


  • Hallo,

    In beiden Fällen oben wurde für ip kein Speicher vereinbart. Deswegen erzeugt eine Dereferenzierung dort undefiniertes Verhalten. Du könntest da z.Bsp. mit new Speicher anfordern.

    Du kannst bei einem dynamisch erzeugten Array im Nachhinein nicht herausbekommen wie groß es ist.
    Das hier

    int length = sizeof(c)/sizeof(*c);
    

    funktioniert also nicht. Du müsstest die Länge mit zurückgeben oder du gibst hier gleich den Vektor zurück.
    Ansonsten müsste das hier

    int* newarr = new int[a.size()];
    

    auch eher so aussehen

    int* newarr = new int[intersect.size()];
    

Anmelden zum Antworten