Moin,
merker = *inhalt; // schreibe in merker das, auf was inhalt zeigt.
merker = *a, oder?
natürlich, da war Vinzenz wohl etwas unaufmerksam.
#include <stdio.h>
// ist das schon eine globale variable oder nur eine definition?
typedef struct data_type {
int age;
char name[20];
} data;
Das ist überhaupt keine Variable - du legst hier nur einen Datentyp fest, sozusagen den Bauplan für künftige Variablen dieses Typs. Warum manche Programmierer noch einen "provisorischen" Namen vor die struct-Klammer schreiben, ist mir schleierhaft; der eigentliche Typname ist das, was hinter der schließenden Klammer steht. Das vorn stehende data_type hat, soweit ich das in meiner rund 15jährigen C-Erfahrung sehe, keinen Zweck, man kann's auch ebensogut weglassen und nach typedef struct gleich die Klammer öffnen.
// soll zurückgeben eine structure typdefiniert mit dem alias "data"
data *mymall()
Korrekter: Einen Zeiger auf eine solche Struktur.
//was macht das (data*) davor? ein typehinting? warum das sternchen plötzlich dahinter?
person = (data*) malloc( sizeof(data) );
Type Hinting wäre untertrieben - der in Klammern stehende Typname ist in C die Schreibweise für ein Typecast (Typumwandlung). In diesem Fall also: Vergiss alles, was malloc() an Typinformationen mitbringt und tu so, als sei es data*.
Im Fall von malloc() halte ich das aber -wenn auch formal korrekt- für Unsinn. Denn malloc() liefert sowieso den Typ void*, also "Zeiger auf einen unbekannten Typ". Ein void* ist zuweisungskompatibel zu allen anderen Zeigertypen und muss deshalb nicht extra gecastet werden. Tut man es trotzdem, macht das den Code für mich nur unübersichtlicher.
if (person !=NULL ) {
Oder einfacher und prägnanter:
if (person)
strcpy ( person->name, "Somename");
}
// nicht *person (ist ja kein array) aber auch nicht &person
Haha. Vom Verständnis her müsste man hier &person->name erwarten - also ein Zeiger auf das Element name innerhalb der data-Struktur, die durch person referenziert wird. Der Sprachstandard von C definiert aber: Der Name eines Arrays ist im Quellcode gleichbedeutend mit einem Zeiger auf das erste Element des Arrays. Weil das implizit per definitionem so ist, lässt man das & an der Stelle weg. Manche Compiler akzeptieren es trotzdem, andere nehmen es murrend mit einer Warnung hin.
clone_person = mymall();
//wenn er jetzt die daten aus mymall zurückgibt - was "er" tut - , dann ist der test gelungen?
Ja. Dann hat die Funktion myall() selbständig Speicher reserviert, mit den Angaben { 122, "Somename" } initialisiert und gibt einen Zeiger auf diesen Speicherblock zurück.
// versuch, den speicher freizugeben, da es ja ein pointer auf eine adresse ist, dürfte clone_person ja auf den selben speicherbereich zeigen wie das returnte "person", oder?
Richtig.
Schönes Wochenende noch,
Martin
Wer im Glashaus sitzt, sollte sich nur im Dunkeln ausziehen.