Frage zu Zeigern in C

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 :frowning:
Mit calloc() krieg ich’s halbwegs hin, aber realloc() gibt IMMER irgendwelche Fehler aus, meistens Segmentation fault (core dumped)

string_test.c```#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include „string_utils.h“

int main() {
char *string1=„hallo“;
char *string2=" welt!";

string1=strstick(string1, string2);
printf("%s

", string1);
free(string1);

return EXIT_SUCCESS;

}

**string_utils.h**```#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *strstick(char *str1, char *str2) {
	char *tmp = str1;
	size_t len1=strlen(str1);
	size_t len2=strlen(str2);
	
	str1=(char *)calloc(len1+len2+1, sizeof(char));
	strcpy(str1, tmp);
	strcat(str1, str2);
	
	return str1;
}

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?

du hast erstmal einen fatalen Fehler gemacht
etwas was du nicht mit new (bei C++) bzw malloc (bei C) angefordert hast NICHT freigeben

[QUOTE=christoph]
string_test.c```#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include “string_utils.h”

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

Reicht das nicht?
free(string1);

Auszug aus C von A bis Z (Openbooks. Rheinwerk-Bücher kostenlos online lesen. Ein Service des Rheinwerk Verlags)

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 :frowning:

[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!

aber die nicht

    char *string2=" welt!";

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.

btw. weißt du wie man realloc() korrekt anwendet?

hmm ok dann glaub ich das mal :wink:

ich hab realloc noch nie benutzt bzw gehört
aber ich hab dir vorhin ne PN geschrieben

k, thx! :slight_smile: