c-string als parameter übergeben und bearbeiten
-
Hallo,
ich habe folgenden code :
void foo (char *& str) { std::string str2(str); //mit str2 arbeite ich jetzt weiter... //... //jetzt soll str2 nach str kopiert werden //1: memcpy(str, str2.c_str(), str2.length()+1); //access violation //2: strcpy_s(str, str2.length()+1, str2.c_str()); //access violation //3: for(unsigned int i = 0; i < str2.length()+1; ++i) { str[i] = str2.c_str()[i]; //access violation } }//so in der art wird die funktion aufgerufen
int main() { char * test = "test"; foo(test); cout << "test : " << test << endl; return 0; ]Ich verstehe einfach nicht warum das nicht geht. Ich übergebe den c string doch als referenz!
Vielen Dank im Voraus.
-
Aktiviere mal Warnungen deines Compilers.
-
So weit ich weiß sind String-Literale nur lesbar, aber du willst in diesen Speicherbereich schreiben.
Wie hast du solchen Code durch den Compiler geprügelt bekommen?
-
Logn schrieb:
Wie hast du solchen Code durch den Compiler geprügelt bekommen?
Stringliterale sind in C nicht const-qualifiziert*. Aber es ist undefiniertes Verhalten (in der Praxis normalerweise ein Absturz), wenn man trotzdem versucht sie zu ändern. Fieses Relikt aus alten Zeiten

*: Und in C++, was der Threadersteller anscheinend (unabsichtlich?) benutzt, ist die Zuweisung in Zeile 3 der main ebenfalls erlaubt (aber deprecated) aus Kompatibilitätsgründen zu C.
@Threadersteller: Dir ist schon klar, dass du da ein paar C++-Features nutzt? Dass man aber andererseits in "richtigem" C++ nicht so wie in C mit Zeichenketten umgeht? Benutz einen C-Compiler für deinen C-Code.
-
Du kannst test als Array definieren.
char test[] = "test";^zumindest in C. Wie das Verhalten dann mit dem C++ foo ist, weiß ich nicht.^
Noch etwas anderes:
Was meinst du, wieviel Platz du in str (in foo)hast?
-
@Nathan
Natürlich habe ich die Warnung aktiviert, aber es gab keine.@Logn
Der Code kompiliert reibungslos in VS13 Express@SeppJ Ich habe meine Frage ausversehen in das C Forum gepostet
, wäre nett wenn es jemand verschieben könnte nach C++. Das Problem ist das ich an einem größeren Code arbeite welcher auch überwiegend aus C-strings besteht.@DirkB
Der string wird durch die Funktion entweder kleiner oder bleibt gleich (von der Länge her).Habe das Problem jetzt gelöst indem ich ein bisschen mit C++ std::strings gearbeitet habe und der member funktion c_str().
Danke für die Hilfe!
-
Ceno schrieb:
@Nathan
Natürlich habe ich die Warnung aktiviert, aber es gab keine.Welchen Compiler verwendest du?
GCC schmeißt ohne irgendwelchen speziellen Warnungsoptionen:warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] char * test = "test";Edit: Ah, wegen strcpy_s vermutlich MSVC. Der gibt da glaube ich wirklich keine Warnung.
-
Nathan schrieb:
Ceno schrieb:
@Nathan
Natürlich habe ich die Warnung aktiviert, aber es gab keine.Welchen Compiler verwendest du?
GCC schmeißt ohne irgendwelchen speziellen Warnungsoptionen:warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] char * test = "test";Hatte ich auch schon bei meinem vorigen Kommentar erwähnt : Visual Studio 2013 Express.
Ja stimmt wenn man nur strcpy benutzt bekommt man eine warnung, mit _s aber nicht!
-
Ceno schrieb:
Ja stimmt wenn man nur strcpy benutzt bekommt man eine warnung, mit _s aber nicht!
Die _s Versionen gibt es aber nicht auf anderen Implementierungen der Standardbibliothek. Die bessere Variante ist imo die normalen zu verwenden und diese Warnung zu dekativieren, so bleibt der Code portabel.
-
Da du die Sicherheit, die dir strcpy_s bieten soll, hier sowieso umgehst (indem du die Länge der Quelle angibst) bringt es dir auch keinen Vorteil.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.