Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zeiger auf Struktur wird nicht erkannt

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
02.04.2007, 19:55 Uhr
~power
Gast


Hi!

kann mir jemand sagen, warum mein Zeiger *p beim kompilieren keinen, aber bei der Auführung 'nen Fehler bringt?


C++:
#include <stdio.h>


struct bruch{
    int zaehler;
    int nenner;};

int main(void)
{
    
    /*struct bruch a;*/
    struct bruch *p;
    /*p=&a;*/
    printf("Geben Sie eine Zahl fuer den Zaehler ein: ");
    scanf("%d",&p->zaehler);
    printf("Geben Sie eine Zahl fuer den Nenner ein: ");
    scanf("%d",&p->nenner);

    printf("Der von ihnen eigegebene Bruch lautet %d/%d\n",p->zaehler,p->nenner);

    return 0;
}


Nehme ich die Kommentierung raus, funktioniert es; aber ich will es per zeiger lösen!

Danke im vorraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.04.2007, 21:15 Uhr
Pablo
Supertux
(Operator)


Weil das Programm syntaktisch richtig ist, semantisch nicht und der Compiler keine Ahnung hat, was du dir dabei überlegt hast.

Dass das Programm nicht das erwünschte Effekt hat, ist abzusehen, denn p zeigt auf Nimmerland bzw. auf das digitale Nirvana, bzw. auf ungültigen Speicher.

Entweder so


C++:
#include <stdio.h>


struct bruch{
    int zaehler;
    int nenner;};

int main(void)
{
    
    /*struct bruch a;*/
    struct bruch p; /* <--- hier der Unterschied */
    /*p=&a;*/
    printf("Geben Sie eine Zahl fuer den Zaehler ein: ");
    scanf("%d",&(p.zaehler));
    printf("Geben Sie eine Zahl fuer den Nenner ein: ");
    scanf("%d",&(p.nenner));

    printf("Der von ihnen eigegebene Bruch lautet %d/%d\n",p.zaehler,p.nenner);

    return 0;
}



oder so


C++:
#include <stdio.h>
#include <stdlib.h>

struct bruch{
    int zaehler;
    int nenner;};

int main(void)
{
    
    struct bruch *p;

    p = malloc(sizeof(struct bruch));

    if(!p) return 1;

    printf("Geben Sie eine Zahl fuer den Zaehler ein: ");
    scanf("%d",&p->zaehler);
    printf("Geben Sie eine Zahl fuer den Nenner ein: ");
    scanf("%d",&p->nenner);

    printf("Der von ihnen eigegebene Bruch lautet %d/%d\n",p->zaehler,p->nenner);

    free(p);

    return 0;
}




Wobei mir gerad auffält, dass du hast


C++:
    /*struct bruch a;*/
    struct bruch *p;
    /*p=&a;*/



und wenn du die erste und dritte Zeile auskommentierst, dann läuft das Programm, weil p dann auf ein gültiges Objekt zeigt.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.04.2007, 22:20 Uhr
~power
Gast


achso, muss ich wenn ich struct datentyp angelegt habe, dynamische speicher freigeben und diesen dann auf *p initialisieren?
dein erster vorschlag, wäre dann ja eine normale variable!

in der vorlesung hatten wir nämlich einfach

struct bla *p; gemacht!

hmm...

wenn ich die kommentierung rausnehme, funktioniert es! das habe ich auch gemerkt, aber dann bräuchte ich wiederrum den zeiger nicht

was bedeutet denn "if(!p)"?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.04.2007, 22:30 Uhr
~power
Gast


Also ich habe gerade dein vorschlag mit malloc getestet! aber es funktioniert nicht!

malloc() ist ja ein Zeiger und zeigt auf nichts!

Es ist es richtig, dass ich ihn mit "struct bruch" caste?
So?:


C++:
p = (struct bruch*)malloc(sizeof(struct bruch));
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.04.2007, 00:23 Uhr
Pablo
Supertux
(Operator)



Zitat:

achso, muss ich wenn ich struct datentyp angelegt habe, dynamische speicher freigeben und diesen dann auf *p initialisieren?



Der struct sagt dem Compiler nur wie er die Bytes zu verstehen hat (wie sie aligniert sind, usw), mehr nicht. Wie bei jedem Datentyp muss jede Instanz irgendwo gespeichert sein. Ein Zeiger ist eine Variable, deren Inhalt eine Adresse ist, diese muss initialisiert werden. Wenn du nur "typ* zeiger;" machst, dann sagst du, dass "zeiger" ein Zeiger auf eine Stelle des Speicher ist, die als 'typ' gelesen werden. Auf welche Stelle "zeiger" zeigen muss, hast du damit nicht getan und deswegen ist der Zugriff über "zeiger" undefiniert.


Zitat:

Also ich habe gerade dein vorschlag mit malloc getestet! aber es funktioniert nicht!



Was heißt "es funktioniert nicht!"?

malloc ist kein Zeiger, malloc ist eine Funktion, die einen void* Zeiger, sprich eine Speicheradresse, zurückgibt. Diesen Speicher nennt man dynamischen Speicher.


Zitat:

Es ist es richtig, dass ich ihn mit "struct bruch" caste?
So?:



In C++ ja, in C nein, es ist unnötig, da C void* implizit castet.


Zitat:

was bedeutet denn "if(!p)"?



das ist äquivalent zu if(p != NULL)
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 03.04.2007 um 00:27 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.04.2007, 02:07 Uhr
0xdeadbeef
Gott
(Operator)


Zu der ganzen stack/heap/statischer Speicher-Problematik gibts in der FAQ einen Beitrag von meinereiner: www.fun-soft.de/showtopic.php?threadid=4351
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.04.2007, 17:21 Uhr
~power
Gast


Jaja, ich verstehe das (eigentlich) mit den Zeigern! Und das mit dem malloc mach eich gerade in der vorlesung, deshalb habe ich da noch nicht so viel wissen drin!

Aber, da malloc einen zeiger auf NULL wiedergibt, muss ich ihn casten!

Wenn ich ihn nämlich nicht caste, kann ich das programm nicht ausführen! Und ich lasse mein Programm code als C-Code cimpilieren!

Aber trotzdem danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.04.2007, 17:47 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)



Zitat von ~power:
Aber, da malloc einen zeiger auf NULL wiedergibt, muss ich ihn casten!

malloc() gibt einen Zeiger auf void zurück, nicht auf NULL! Das ist der generischer Datentyp, was heißen soll, dass du es zu jedem beliebigen Typ casten kannst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.04.2007, 19:32 Uhr
0xdeadbeef
Gott
(Operator)


Naja - wenn kein Speicher mehr da ist, kann malloc sehr wohl NULL zurückgeben. Das hat aber mit dem Casten wenig zu tun - NULL ist auch nach dem Casten NULL.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.04.2007, 07:54 Uhr
~power
Gast


Achja...ähm..war völlig durcheinander!!! Natürlich...es ist ein void* zeiger und er kann auf NULL zeigen,wenn kein Speicher frei ist!! oh man...alles durcheinander gewürfelt, was es nur gibt!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: