Der Martin: Anfängerfrage zu Strings in C

Beitrag lesen

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.