Sie sind nicht angemeldet.

Ghill

Schüler

  • »Ghill« ist männlich
  • »Ghill« ist der Autor dieses Themas

Beiträge: 77

Wohnort: Deutschland/Aach

Beruf: Schüler

  • Nachricht senden

1

29.12.2006, 14:00

frage zu c-programm

hallo,
ich lese zur zeit ein buch zum thema c.
in einem beispiel findet sich folgende funktion:

void Sort(struct adres sort[], int nr) {
int i,j;
struct adres *temp;

temp = (struct adres *)malloc(sizeof(struct adres *));
if(NULL == temp) {
printf("Konnte keinen Speicher reservieren...\n");
return;
}
for(i = 0; i < nr; i++) {
for(j=i+1;j<nr;j++) {
if(strcmp(sort.nname, sort[j].nname) > 0) {
*temp=sort[j];
sort[j]=sort[i];
sort[i]=*temp;
}
}
}
printf(".....Sortiert!!\n\n");
}

als sort wird der funktion adressen übergeben:
struct adres {
char vname[MAX];
char nname[MAX];
long PLZ;
char ort[MAX];
int geburtsjahr;
} adressen[100];

jetzt ist miene frage:
mit temp = (struct adres *)malloc(sizeof(struct adres *)); zeigt doch temp auf einen speicherbereich mit 4byte für einen pointer auf eine struktur adres.

man kann dann doch nicht einfach mit *temp=sort[j]; diesen 4 byte die struktur zuweisen??

Ist das ein tippfehler im beispiel und sollte "temp = (struct adres *)malloc(sizeof(struct adres));" heißen oder versteh ich das irgendwie noch falsch?

vielen dank für jede hilfe
Ghill
"Das, wobei unsere Berechnungen versagen, nennen wir Zufall." - Albert Einstein

2

29.12.2006, 15:07

hast du es mal kompiliert? bei mir funktioniert es in einem kleinen testprogramm (datei im anhang). einzige erklärung die ich finden kann, ist die, dass malloc() speicher automatisch für das objekt, nicht den zeiger allokiert, allerdings habe ich die funktion noch nie benutzt, weiss also nichts darüber (code eigentlich c++). da eigentlich die benutzung des []-operators im prinzip dasselbe ist wie eine dereferenzierung eines zeigers, dürfte da auch kein zeiger bei rauskommen. wie gesagt, ich bin mir nicht sicher, aber das ist die einzig logische erklärung für mich, da bei meinem testprogramm bei
temp = (struct adres *)malloc(sizeof(struct adres *));
und
temp = (struct adres *)malloc(sizeof(struct adres));
dasselbe rauskommt.

mfg,
julian
»-=Freaky=-« hat folgende Datei angehängt:
  • test.cpp (1,97 kB - 17 mal heruntergeladen - zuletzt: 03.02.2011, 14:27)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »-=Freaky=-« (29.12.2006, 15:09)


3

29.12.2006, 16:56

ok ich hab mal im c/cpp-forum nachgefragt und es scheint ein tippfehler zu sein.
hier der link

mfg,
julian

Ghill

Schüler

  • »Ghill« ist männlich
  • »Ghill« ist der Autor dieses Themas

Beiträge: 77

Wohnort: Deutschland/Aach

Beruf: Schüler

  • Nachricht senden

4

29.12.2006, 16:58

danke erstmal für deine antwort.

printf("%d", sizeof(struct adres *)) gibt 4 aus, daher würde ich sagen, dass malloc speicher für den pointer nicht für das objekt reserviert. ich hab nochmal ein paar seiten zurückgeblättert, da stand, dass wenn man mehr speicherplatz als angefordert beschreibt, das programm durchaus laufen kann, oder auch nicht...

bei mir lief es auch ohne fehler, ich wollte nur sicher sein, dass ich hier nix falsch verstanden habe.

richtig wird wohl temp = (struct adres *)malloc(sizeof(struct adres)); sein.
"Das, wobei unsere Berechnungen versagen, nennen wir Zufall." - Albert Einstein

5

29.12.2006, 17:04

ja,

Quellcode

1
temp = (struct adres *)malloc(sizeof(struct adres))

funktioniert und ist in dem sinne auch nicht falsch, aber warum muss temp überhaupt ein zeiger sein?
so gehts auch:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Sort(struct adres sort[], int nr)
{
  int i,j;
  struct adres temp;

  for(i = 0; i < nr; i++)
 {
    for(j=i+1;j<nr;j++)
    {
      if(strcmp(sort[i].nname, sort[j].nname) > 0)
      {
        temp=sort[j];
        sort[j]=sort[i];
        sort[i]=*temp;
      }
    }
  }
  printf(".....Sortiert!!\n\n");
}


btw: war das sowas wie ein negativ-beispiel für ein programm oder ist das sowas wie ein negativ-beispiel für ein c-buch?

mfg,
julian

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »-=Freaky=-« (29.12.2006, 17:06)


Ghill

Schüler

  • »Ghill« ist männlich
  • »Ghill« ist der Autor dieses Themas

Beiträge: 77

Wohnort: Deutschland/Aach

Beruf: Schüler

  • Nachricht senden

6

29.12.2006, 17:10

stimmt, ich denke der autor wollte vllt. die speicherreservierung nochmal üben (vorheriges kapitel).
danke für den link, den hab ich grad eben erst geshen^^
jetzt kann ich mich dann ma wieder ans lesen machen, ohne dieses "warum versteh ich das nich"-Gefühl^^

das buch heißt "C von A bis Z" von Jürgen Wolf, Galileo Computing.
"Das, wobei unsere Berechnungen versagen, nennen wir Zufall." - Albert Einstein

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ghill« (29.12.2006, 17:12)


7

29.12.2006, 17:25

naja, dann war das erstmal ein unpassendes beispiel für speicherreservierung und dann noch mit einem fehler. naja, vielleicht ist das ja eine ausnahme in dem buch, wundert mich eigentlich schon, da galileo computing ja einen guten ruf hat und ich habe auch ein buch aus dem verlag (c/c++, ullrich kaiser) und da ist top, noch keinen fehler gefunden, gute motivierende beispiele usw., aber wie gesagt auch von nem anderen autor.
naja dann mal noch viel spaß beim lesen&lernen (freu dich, dass du genug zeit in den ferien hast dafür, ich lern den ganzen tag latein-vokabeln :schnarch: ).

mfg,
julian

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »-=Freaky=-« (29.12.2006, 17:31)


Thema bewerten