Xin hat geschrieben:
Okay, an der Stelle sind wir dann vielleicht etwas zu Linux betont.
Das werde ich nicht ändern, aber man kann ja gucken, ob wir das mit Windows nicht konkretisieren.
Naja, es benutzen halt mehr Leute Linux wenn es um Programmierung geht, aber ich mache das ja nicht Hauptberuflich
Ich hätte noch eine Frage zu dem Thema 'Strukturen', besser gesagt zu dem Programm 'Arrays mit Strukturen'
int main(void)
{
struct Person personen [ 10 ];
struct Person * weiterePersonen;
weiterePersonen = ( struct Person * ) malloc ( 10 * sizeof ( struct Person ) );
if ( weiterePersonen )
{
strcpy( weiterePersonen->firstName, "Hans" );
strcpy( weiterePersonen->familyName, "Mustermann" );
weiterePersonen->age = 20;
strcpy( weiterePersonen->mainAddress.Street, "Hauptstrasse" );
weiterePersonen->mainAddress.houseNumber = 1;
weiterePersonen->mainAddress.zipCode = 12345;
strcpy( weiterePersonen->mainAddress.town, "Musterstadt" );
callByPointer ( &weiterePersonen[0] );
free ( weiterePersonen );
}
callByPointer ( &personen[0] );
system ( "PAUSE" );
return 0;
}
Das ist ja der Quelltext, der im Tutorial verwendet wird. Wenn ich das Programm kompiliere kommen die ersten 2 Zeilen, die bei callByPointer ausgegeben werden sollen und danach kommt noch einmal "Name:" und ab da eine riesige Ansammlung von Sonderzeichen.
Mir ist erst beim Step-By-Step Durchlauf aufgefallen warum
Müsste es nicht eigentlich anstatt if eine for Anweisung sein, oder ein anderer Counter, der den Vorgang für die Größe des Arrays wiederholt? Denn sonst macht das definierte Array ja überhaupt keinen Sinn, da wir die erste Spalte voll schreiben, das Array wieder löschen und dann ein unbeschriebenes Array übergeben.
Ich habe das Programm jetzt folgendermaßen geändert
struct Address
{
char Street[64];
unsigned int houseNumber;
unsigned int zipCode;
char town[64];
};
struct Person
{
char firstName[64];
char familyName[64];
unsigned int age;
struct Address mainAddress;
struct Address secondaryAddress;
};
void callByPointer ( int counter, struct Person * p )
{
printf ( "Person #%d: %s %s (%d)\n", counter + 1 , p -> firstName, p -> familyName, p -> age );
printf ( "Adresse; %s %d; %d %s\n", p -> mainAddress.Street, p -> mainAddress.houseNumber, p -> mainAddress.zipCode, p -> mainAddress.town );
}
int main(void)
{
int counter = 0;
struct Person personen [ 10 ];
struct Person * weiterePersonen;
weiterePersonen = ( struct Person * ) malloc ( 10 * sizeof ( struct Person ) );
if ( weiterePersonen )
{
while ( counter < 10 )
{
strcpy( weiterePersonen->firstName, "Hans" );
strcpy( weiterePersonen->familyName, "Mustermann" );
weiterePersonen->age = 20;
strcpy( weiterePersonen->mainAddress.Street, "Hauptstrasse" );
weiterePersonen->mainAddress.houseNumber = 1;
weiterePersonen->mainAddress.zipCode = 12345;
strcpy( weiterePersonen->mainAddress.town, "Musterstadt" );
callByPointer (counter, weiterePersonen );
personen [ counter ] = * weiterePersonen;
++counter;
free ( weiterePersonen );
}
}
system ( "PAUSE" );
return 0;
}
Allerdings stürzt das Programm jetzt mit folgender Fehlermeldung ab
HEAP[Call_By_Pointer.exe]: Invalid address specified to RtlValidateHeap( 00CD0000, 00CD3490 )
Anscheinend überschreite ich irgend eine Adressgrenze, oder was sagt dieser Fehler aus?