Einfügen eines Elementes in ein Struct-Pointer



  • Hallo,
    die Funktion insert() habe ich gecshrieben, alles andere war vorgegeben.
    Am ende des hinzufügens soll das Array was im insert returned wird dem vom test (also **testArray)
    entsprechen. Jedoch stürtzt mein Programm bei hinzufügen von x und y ab.
    Kann mir jemand einen Rat geben, wie ich diese Elemente von testArray in meins am besten hinzufüge? Ich habe schon alles versucht, komme aber nicht darauf.
    Viele Grüße

    typedef struct
    {
    	//Koordinaten
    	int x,y;
    } myCoordinate;
    int bouncer = 0;
    
    
    myCoordinate *createStructStorage()
    {
    	myCoordinate **a = (myCoordinate**)malloc(1*sizeof(myCoordinate*));
    	return *a;
    }
    myCoordinate insert(myCoordinate *insertA, myCoordinate *insertB)
    {
    	(insertA+bouncer)->x = insertB->x;
    	(insertA+bouncer)->y = insertB->y;
    	bouncer++;
    	return *insertA;
    }
    
    void test2()
    {
    	printf("Test2:\n");
    	myCoordinate **testArray = (myCoordinate **)malloc(3*sizeof(myCoordinate*));
    	for (int i = 0; i < 3; ++i)
    	{
    		testArray[i] = (myCoordinate *)malloc(sizeof(myCoordinate));
    		testArray[i]->x = i;
    		testArray[i]->y = i*10;
    	}
    
    
    	myCoordinate *storage = createStructStorage();
    
    	insert(storage, testArray[0]);
    	insert(storage, testArray[1]);
    }
    

  • Mod

    Worauf zeigt insertA+bouncer? Auf nichts.

    Das Gute ist: Wenn du im Unterricht nicht mitkommst, dann ist das gut für dich, dann hast du diesen Unsinn nicht verinnerlicht. Das Schlechte ist: Euer Lehrer hat nicht die leiseste Ahnung, was er tut. Ernsthaft. Das ist ohne Scherz oder Übertreibung einer der schlimmeren Codes, die hier jemals gepostet wurden, an die ich mich erinnern kann. Und das Forum ist ganz schön alt und ich kann mich an ganz schön viel erinnern. Du bist besser beraten, auf eigene Faust nach einem guten Buch zu lernen.



  • Sag bitte, bitte, daß der Kot nicht von Deinen Übungsleitern ist.



  • @Swordfish @SeppJ leider ist der Code von meinem Übungsleiter. Ich habe auch von meinen Kommilitonen sehr viel negatives gehört...



  • Dann egal wie die Aufgabe lautet, Du kannst sie mit dem Hinweis darauf daß sie mit dieser Vorgabe unlösbar ist verweigern:

    @pcovc sagte in Einfügen eines Elementes in ein Struct-Pointer:

    myCoordinate *createStructStorage()
    {
    	myCoordinate **a = (myCoordinate**)malloc(1*sizeof(myCoordinate*));
    	return *a;
    }
    

    Hier ist a ein Zeiger auf einen Zeiger auf ein myCoordinate. Es wird auch Speicher der groß genug für einen Zeiger auf myCoordinate ist reserviert und dessen Adresse in a gespeichert (Der cast nach myCoordinate** ist unnötig.), aber:

    a zeigt nun auf einen Zeiger auf myCoordinate (myCoordinate*) dessen Wert undefiniert ist. Dasselbe wie (der Einfachheit halber mit int):

    int *foo;  // Ein Zeiger auf int. Dieser Zeiger hat ein undefined pointer value.
    int **a = &foo;  // a zeigt nun auf diesen Zeiger foo. Der Wert des Zeigers foo ist immer noch undefiniert (zeigt in die Pampa).
    return *a;  // gibt diesen undefinierten (und somit nutzlosen) Wert zurück.
    

    Jeder Versuch diesen zurückgegebenen Wert zu verwenden führt zu undefiniertem Verhalten (UB, Undefined Behaviour). Der reservierte Speicher selbst ist nicht mehr zugänglich weil die Adresse die malloc() geliefert hat verlorengeht.

    Auch

    @pcovc sagte in Einfügen eines Elementes in ein Struct-Pointer:

    	myCoordinate **testArray = (myCoordinate **)malloc(3*sizeof(myCoordinate*));
    	for (int i = 0; i < 3; ++i)
    	{
    		testArray[i] = (myCoordinate *)malloc(sizeof(myCoordinate));
    		testArray[i]->x = i;
    		testArray[i]->y = i*10;
    	}
    

    ist schon grausig, aber dazu steht ja schon etwas in Deinem anderen Thread.


  • Mod

    @Swordfish sagte in Einfügen eines Elementes in ein Struct-Pointer:

    (Der cast nach myCoordinate** ist unnötig.),

    Wieso? Das verdeckt doch sehr schön den Fehler, der auftreten würde, da bestimmt vergessen wurde, stdlib.h einzubinden 🙂


Anmelden zum Antworten