C kopieren char * zu char[]
Hallo, ich bin versucht zu kopieren char * Zeiger auf ein char [] - array.
dies ist mein code bisher
char * string_add(char * base, char * toAdd)
{
char * string=malloc(strlen(base)+streln(toAdd)+1);
sprintf(string,"%s%s",base,toAdd);
char returnString[strlen(string)+1];
//here comes my problem:
memcpy(returnString,string,strlen(string)+1);
//want to add free(string) here
return returnString;
}
Möchte ich so eine Funktion zum speichern von code. Ich möchte nicht, sich nach jedem allozierten Speicher. Ich habe auch versucht
memcpy(&returnString,string,strlen(string)+1);
sowie einige Varianten mit strcpy und strncpy. Aber Folgendes problem besteht:
wenn rufe ich die Funktion zweimal wie:
int main(int argc, char * argv[])
{
char * str1=string_add(argv[1],"-test1");
char * str2=string_add(argv[1],"-test2");
printf("%s, %s", str1,str2);
}
die Ausgabe wie:
abc-test2, abc-test2
Wie kann ich dies erkennen?
Vielen Dank im Voraus!
- Die Sie zurückgeben der Adresse von einem automatischen Variablen
returnString
. Müssen Sie sich nicht mehr als diestring
Puffer. Setzen Sie einfachstring[strlen(base) + strlen(toAdd)] = 0
(oder verwenden Sie den Rückgabewert vonsprintf
zu wissen, wie langestring
ist, oder speichern Siestrlen(base) + strlen(toAdd)
bevor Siemalloc
) undreturn string
. - aber wenn ich
return string
ich frei später das Ergebnis. Dies ist, was ich vermeiden möchte. - man kann nicht wirklich vermeiden. wenn du die Möglichkeit hast von C++, dann können Sie mit smart Pointern, aber in C ist, müssen Sie entweder preallocate, oder verwalten Sie Ihre malloced Speicher
- auch wenn Sie nicht
return string
haben Sie immer noch, Sie zu befreien. So wie es jetzt ist, Ihren code ein Speicherleck hat.
Du musst angemeldet sein, um einen Kommentar abzugeben.
in C, müssen Sie sich nach der malloced Speicher, das char-array erklären Sie ist auf dem Stapel, und verschwunden sein, nachdem die Funktion, nur das malloc Speicher rumhängen. und ja, Sie werden um ihn zu kümmern und ihn zu säubern.
Ich gehe davon aus, dass der zweite Aufruf der Funktion überschreibt den Inhalt der Zwischenablage erstellt, indem der erste Anruf.
Meinem Verständnis, Sie versuchen, Sie zu verketten von zwei Zeichenketten.
Einen Blick in diese Antwort.
Grundsätzlich, da die Länge der strings ist nicht bekannt, zur compile-Zeit, Sie müssen zum zuweisen dynamischer Speicher, während nicht zu vergessen, um
free
es, nachdem Sie fertig sind der Handhabung der neuenstring
.Grundsätzlich Speicher, der NICHT
malloc
'ed NICHT bestehen nach einer routine enden. Sie können möglicherweise verwenden Sie die globalen vars, aber das würde complexify eine einfache Aufgabe, d.h. zwei strings verketten.In der Funktion
Definieren Sie
returnString[]
aber es lebt nur in dem Gültigkeitsbereich der Funktion. So ändern Sie die Logik hinter dem Gebrauch und der Erklärung derreturnString[]
char * test="blabla"
ich nicht nennenfree(test)
ich zurückkehren will einen char, die ich nicht haben, zum kostenlosen!Also gibt es etwas falsch mit dem code. First off Sie tun:
falsch ist, geht davon aus, dass jeder char ist 1 byte, die es hängt von der Plattform ab. Was ist besser zu tun ist:
plus malloc wird teuer in Bezug auf CPU-Zeit und Sie nicht befreien. Tun, was Sie tun in diesem code muss nicht die malloc selbst. Nur dazu:
Sekunde alle, sollten Sie deal mit den strings anders. Was Sie tun können ist dieses:
oder. Das beste, was zu tun, für so etwas ist, deklarieren Sie in der main-str1 und str2, malloc Ihnen in main, übergeben Sie den Zeiger auf den Zeiger auf die Funktion. Die Funktion kopieren/Katze die Daten wie ich oben zeigte. und dann auf fertig stellen. Jetzt brauchen Sie nicht, um befassen sich mit Rückkehr-Typen und alle, die innere mallocing und Mist wie, dass. Sie nur den Umgang mit zwei mallocs in Haupt-und 2 freien ist im wesentlichen, nachdem Sie Sie verwenden. Hier ist der pseudo-code:
nun, hier ist die copyString Funktion:
sizeof(char)
ist garantiert 1.