Ich habe vor ein paar Wochen angefangen mir C selber beizubringen und hab mir dazu das Buch C von A bis Z gekauft.
Hab mich dann mal etwas mit dem reservieren von Speicher und mit Zeigern herumgespielt. So habe ich eine Funktion geschrieben die zwei Strings aneinanderhängt, und das reservieren von Speicher gleich automatisch vornimmt.
Leider habe ich keinen Plan von der Funktionsweise von realloc(), die laut Buch am besten für soetwas geeignet wäre
Mit calloc() krieg ich’s halbwegs hin, aber realloc() gibt IMMER irgendwelche Fehler aus, meistens Segmentation fault (core dumped)
Es funzt auch so, nur hätte ich eigentlich so vorgehabt, dass ich den Rückgabewert von strstick() nicht extra der Variable string1 zuweisen muss - weil der Funktion ja der Zeiger übergeben wird! Außerdem habe ich das Gefühl dass ich hier nicht gerade den optimalen Weg gegangen bin …
Was mache ich falsch, bzw. was habe ich noch nicht richtig verstanden?
int main() {
char *string1=“hallo”;
char *string2=" welt!";
string1=strstick(string1, string2);
printf("%s
", string1);
free(string1);
return EXIT_SUCCESS;
}
deine "Strings" wrden automatisch vom Compiler erzeugt und er gibt diese auch frei
die Methode calloc ist mir aber noch nie begegnet ich kenne das Reservieren von Speicher nur mit malloc
char* c = malloc(sizeof(char));
was soll "size_t" sein? strlen gibt doch auch nur die Länge zurück als int.
Dazu kommt du musst jeden String mit \0 abschließen sonst gibs kleine Speicherüberläufe
ich hab C++ Entpackt das ist auch ganz gut
Um die Länge eines Strings zu ermitteln, kann die Funktion strlen() (string length) eingesetzt werden. Die Syntax lautet:
size_t strlen(const char *s1);
Auch wenn size_t anscheinend bei den meisten Compilern int entspricht, ist es doch ein eigener Datentyp. Ich bin noch totaler Frischling in C, deswegen wollte ich mich möglichst an das Buch halten.
Macht das strcat() nicht selber?? oÔ
Wegen malloc() bzw. calloc() - wenn str1 bereits Werte beinhaltet, werden diese wieder gelöscht wenn ich neuen Speicher mit malloc()/calloc() reservieren möchte. Anscheinend ist hier realloc() besser geeignet, allerdings kann ich mit dieser Funktion nicht umgehen
[QUOTE=christoph]Reicht das nicht? free(string1);
[/qoute]
nein das ist ja schon zuviel, deine die du da oben angelegt hast solltest du nicht freigeben das passiert automatisch durch den Compiler.
aber du hast in deinen 1. Strings das vergessen da muss das mit rein
Ich verstehe nicht was du meinst. Der zusammengefügte String der zurückgegeben wird besitzt ein \0 am Ende, hab ich soeben mit einer Schleife überprüft!
Doch auch die!
Wenn man diese Schreibweise wählt, haben die automatsch ein \0 am Schluss. Hab ich schon nachgeprüft, und steht auch so im Buch.
Anders wäre das, wenn ich die Strings so angegeben hätte: char *string1={'h','a','l','l','o'}; Hier wäre das der Fall.