Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

16.10.2009, 23:14

Pointer

hi leute!

schnelle frage..


wenn ich da stehn habn

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main()
{
    int *myptr;
    myptr = NULL;

    int bla = 10;

    myptr = bla;

    return 0;
}


ist das dann falsch? muss ich für meinen pointer speicher reservieren?
oder kann ich das sorglos zuweisen und den pointer danach einfach wieder nullen?

bitte anführen warum was so sein soll wie ihr es behauptet wenn geht.

danke!
sorry für die knappen formulierungen ich muss leider los ^^
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

2

16.10.2009, 23:38

Re: Pointer

Zitat von »"$nooc"«

C-/C++-Quelltext

1
2
3
4
5
6
    int *myptr;
    myptr = NULL;

    int bla = 10;

    myptr = bla;
ist das dann falsch?

Ja, das ist falsch. Du kannst einem Zeiger auf int keinen int zuweisen. Du kannst ihm höchstens die Adresse eines ints geben, das sähe dann aber so aus:

C-/C++-Quelltext

1
int* myptr = &bla;

Ich frage mich sowieso, wieso du drei Anweisungen benötigst, um einen Zeiger zu setzen. Die leere Deklaration und das Nullsetzen ist unnötig, da du den Zeiger dazwischen eh nicht brauchst. Deklarier ihn erst, wenn erforderlich.

Zitat

muss ich für meinen pointer speicher reservieren?
Nein, du kannst ihn auch auf etwas Bestehendes zeigen lassen, wie hier auf bla.

Ich rate dir, als gute Einführung in Zeiger diesen Artikel aus dem C++-Forum zu lesen.

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

3

16.10.2009, 23:39

Also theoretisch geht das, aber dass wird nicht das ergebniss bringen,
welches du willst... oder doch ?

Was du machst ist folgendes:

1. Du definierst einen Zeiger, der nach der zweiten Anweisung auf die
Speicherstelle "0"zeigt.
2. Du definierst eine int-variable auf dem stack und weist ihr 10 zu.
3. Du setzt deinen Zeiger auf 10, was bedeutet, er zeigt nun an die
Speicherstelle "10"... und ich denke mal dass du dass nicht willst :),
weil du da glaube ich keine berechtigung hast zu lesen... ( Befindet sich da nicht irgendwie die Interrupt-tabelle ?)

ich denke mal du willst deinen zeiger auf deine int-variable zeigen lassen.
Da brauchst du nur ein "&" ergänzen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main()
{
    int *myptr;
    myptr = NULL;

    int bla = 10;

    myptr = &bla;

    return 0;
} 


oder du willst ein int auf dem heap erzeugen und diesem 10 zuweisen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main()
{
    int *myptr;
    myptr = new int;

    int bla = 10;

    *myptr = bla;

    // Löschen nicht vergessen

    delete myptr;

    return 0;
} 

4

16.10.2009, 23:43

Zitat von »"Databyte"«

Also theoretisch geht das [...]
3. Du setzt deinen Zeiger auf 10, was bedeutet, er zeigt nun an die
Speicherstelle "10"... und ich denke mal dass du dass nicht willst :),

Nein, der Code wird einen Compilerfehler verursachen. So schwach typisiert ist C++ nicht, als dass es implizite Umwandlungen zwischen Zeigern und integralen Typen erlauben würde. Für diesen Zweck gibt es den reinterpret_cast-Operator.


Zitat von »"Databyte"«

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main()
{
    int *myptr;
    myptr = new int;

    int bla = 10;

    *myptr = bla;

    // Löschen nicht vergessen

    delete myptr;

    return 0;
} 

Der Code erhält sehr viel Redundanz. Das folgende Programm macht das Gleiche:

C-/C++-Quelltext

1
2
3
4
5
6
int main()
{
    int bla = 10;
    int* myptr = new int(bla);
    delete myptr;
}

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

17.10.2009, 00:02

Zitat von »"Nexus"«

Zitat von »"Databyte"«

Also theoretisch geht das [...]
3. Du setzt deinen Zeiger auf 10, was bedeutet, er zeigt nun an die
Speicherstelle "10"... und ich denke mal dass du dass nicht willst :),

Nein, der Code wird einen Compilerfehler verursachen. So schwach typisiert ist C++ nicht, als dass es implizite Umwandlungen zwischen Zeigern und integralen Typen erlauben würde. Für diesen Zweck gibt es den reinterpret_cast-Operator.


Da hast du natürlich recht, deshalb geht es ja auch nur theoretisch...
das der Compiler einen Fehler rauswerfen wird is klar,
aber sein code bewirkt (ohne das casten zu betrachten), das was ich gesagt habe
und da er ja nicht genau geschrieben hat was er machen will, kann es auch sein, dass er den zeiger gerne auf 10 haben will :).

Zitat von »"Nexus"«

Zitat von »"Databyte"«

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main()
{
    int *myptr;
    myptr = new int;

    int bla = 10;

    *myptr = bla;

    // Löschen nicht vergessen

    delete myptr;

    return 0;
} 

Der Code erhält sehr viel Redundanz. Das folgende Programm macht das Gleiche:

C-/C++-Quelltext

1
2
3
4
5
6
int main()
{
    int bla = 10;
    int* myptr = new int(bla);
    delete myptr;
}


Na und ? In dem Fall enthält das auch 3 Redundanzen... einfacher:

C-/C++-Quelltext

1
2
3
int main()
{
}


Wollte halt seinen eigenen code nur minimal verändern.

6

17.10.2009, 00:12

Zitat von »"Databyte"«

Da hast du natürlich recht, deshalb geht es ja auch nur theoretisch...
das der Compiler einen Fehler rauswerfen wird is klar
Wenn es so klar ist, sag das doch nächstes Mal, sonst verwirrst du die Leute nur. Die Aussage, dass sein Code so funktioniere, ist nämlich eindeutig falsch. ;)

Zitat von »"Databyte"«

Wollte halt seinen eigenen code nur minimal verändern.
Okay. Ich wollte halt zeigen, dass das Ganze viel kürzer geht und - im Gegensatz zu deinem "redundanzfreien" Code - trotzdem das Gleiche bewirkt. Den Header <stdio.h> braucht man hier nicht, und auch das Fragmentieren der einzelnen Anweisungen bringt keinen wirklichen Vorteil.

Die ganze Geschichte mit "Zeiger immer sofort nullsetzen" ist sowieso Blödsinn. In vielen Funktionen hat man lokale Zeiger, die gleich mit einem Wert initialisiert werden. Dann kann man das auch ruhig direkt tun. Man muss natürlich nicht die Deklaration und erste Verwendung 10 Zeilen trennen...

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

7

17.10.2009, 00:38

Zitat von »"Nexus"«

Zitat von »"Databyte"«

Da hast du natürlich recht, deshalb geht es ja auch nur theoretisch...
das der Compiler einen Fehler rauswerfen wird is klar
Wenn es so klar ist, sag das doch nächstes Mal, sonst verwirrst du die Leute nur. Die Aussage, dass sein Code so funktioniere, ist nämlich eindeutig falsch. ;)

Wo siehst du die Aussage, dass sein Code funktioniert ? :)
Lediglich der Ansatz - nämlich einen pointer auf mem-"10" zeigen zu lassen - ist richtig
Bis auf einen "(int*)" beziehungsweise "reinterpret_cast<int*>(...)" fehlt da nämlich nichts.
Und diese Art von Casts ist auch nur da um dem Compiler zu sagen, dass man mit der pointer-umwandlung einverstanden ist.
(Obwohl ich hinzufügen muss, dass ein reinterpret_cast mir auch schonmal den inhalt eines pointers verändert wiedergegeben hat)

Zitat von »"Nexus"«

Zitat von »"Databyte"«

Wollte halt seinen eigenen code nur minimal verändern.
Okay. Ich wollte halt zeigen, dass das Ganze viel kürzer geht und - im Gegensatz zu deinem "redundanzfreien" Code - trotzdem das Gleiche bewirkt. Den Header <stdio.h> braucht man hier nicht, und auch das Fragmentieren der einzelnen Anweisungen bringt keinen wirklichen Vorteil.

Die ganze Geschichte mit "Zeiger immer sofort nullsetzen" ist sowieso Blödsinn. In vielen Funktionen hat man lokale Zeiger, die gleich mit einem Wert initialisiert werden. Dann kann man das auch ruhig direkt tun. Man muss natürlich nicht die Deklaration und erste Verwendung 10 Zeilen trennen...


Haste recht, ich hätt es auch so gemacht wie du....(obwohl ich mich gerade frage, wann ich das letzte mal ein int auf dem heap allokiert habe ? ;) .. galub das war noch java ;) )

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

8

17.10.2009, 01:43

Zitat von »"Databyte"«


(Obwohl ich hinzufügen muss, dass ein reinterpret_cast mir auch schonmal den inhalt eines pointers verändert wiedergegeben hat)


wieso den das? mir noch nie passiert, auf reinterpret_cast kann man sich
auch bei mehrfachvererbung, etc... verlassen!
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

9

17.10.2009, 02:21

Zitat von »"Gotbread"«

Zitat von »"Databyte"«


(Obwohl ich hinzufügen muss, dass ein reinterpret_cast mir auch schonmal den inhalt eines pointers verändert wiedergegeben hat)


wieso den das? mir noch nie passiert, auf reinterpret_cast kann man sich
auch bei mehrfachvererbung, etc... verlassen!


Das hat mich ja auch gewundert... und hat natürlich voll den Fehler verursacht...
hab nen halben tag danach gesucht... dann hab ich das ganze durch einen
static_cast ersetzt und dann hat es funktioniert.... sehr seltsam...

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

10

17.10.2009, 12:19

hi leute!
danke für die antworten!


also mir ging es eigentlich nur um

C-/C++-Quelltext

1
int *myP = new int;


denn ich habe neulich ein programm auf linux kompiliert mit folgendem code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
    int *myP;
    *myP = 5;

    printf("hi");
    return 0;
}


wenn ich das ausführen wollte (also NACH dem kompilieren) warf mir das system den fehler "Segmentation fault" aus.
mir haben dann die leute gesagt dass ich mit malloc() speicher reservieren muss damit mein programm ausgeführt wird.
und da hier [1] nichts angeführt ist von wegen "ich muss für sowas speicher reservieren" wollte ich das nicht glauben.

deren meinung war es dass es so aussehen müsste:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
    int *myP = malloc(sizeof(int));
    *myP = 5;

    printf("hi");

    free(myP);
    return 0;
}


tja, und ich wollte mich nicht überzeugen lassen davon ^^

PS: es ist von C die rede. hätte ich dazu sagen sollen :D

[1] http://msdn.microsoft.com/en-us/library/whkd4k6a%28VS.71%29.aspx
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige