va_start und Referenzen
-
Hallo zusammen.
va_start funktioniert nicht korrekt, wenn der übergebene Parameter eine Referenz ist. Wenn ich die Defekte va_list dann mit vprintf verwende, erscheint folgender Fehler: "Unhandled exception at 0x10227c2f (msvcr80d.dll) in Test.exe: 0xC0000005: Access violation reading location 0xcccccccc."
Demo:
#include "stdarg.h" #include "stdio.h" void Test (int& iTest, ...) { va_list va; va_start (va, iTest); vprintf ("%s", va); // sollte "test" ausgeben va_end (va); } int main (int argc, char* argv[]) { int iTest = 0; Test (iTest, "test"); return 0; }Ich vermute mal, dass es sich um einen Bug in Visual C++ 2005 handelt. Sollte jemand einen Workaround kennen, dann imemr her damit

Grüße,
Neku
-
Hallo
Referenzen gibt es in C nicht.
chrische
-
Referenzen gibt's in C nicht. Wie ist der VC++ eingestellt, auf C oder C++ Source?
-
Mal angenommen va_start ist etwas was sich die Adresse des letzten Objektes der fixen Argumentliste holen möchte - es wird scheitern, weil die Adresse einer Referenz die Adresse des Ursprungsobjektes ist...
EDIT:
Das ist keine wissenschaftlich fundierte Aussage, aber in etwa so stelle ich mir vor wie es zu dieser Access Violation kommt
-
Ausserdem solltest du ueberpruefen ob es sich wirklich um einen c-string handelt.
Wenn ja, dann machst du noch den Zugriff falsch, verwende mal folgendes:void Test (int* iTest, ...) { va_list va; va_start (va, iTest); vprintf ("%s", va_arg( va, char * ) ); // sollte "test" ausgeben va_end (va); }
-
@moe szyslak:
Nein, denn vprintf erwartet va_list und nicht char* - bei printf ohne v wär's was anderes.Prüfen geht bei variablen Argumentlisten im übrigen nicht, deshalb sind die in C++ ja auch verpönt (und ne Referenz ist C++)
-
ups, stimmt, hab zu schnell gelesen, danke!
-
Ehrlich gesagt hatte ich keinen Schimmer ob es in C Referenzen gibt, als ich mich zwischen C und C++-Forum entscheiden musste, also habe ich mich danach gerichtet, dass vsprintf aus C stammt

Wenn das Thema jemand verschieben könnte wäre nett

@LordJaxom: Klingt sogar logisch
Intern sind Referenzen zwar auch nur Pointer, aber ich denke, dass mir das hier nicht helfen wird.
-
Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
das fällt unter 18.7/3
The restrictions that ISO C places on the second parameter to the va_start() macro in header <stdarg.h> are different in this International Standard. The parameter parmN is the identifier of the rightmost parameter in the variable parameter list of the function definition (the one just before the ...). If the parameter parmN is declared with a function, array, or reference type, or with a type that is not compatible with the type that results when passing an argument for which there is no parameter, the behavior is undefined.
SEE ALSO: ISO C subclause 4.8.1.1.
-
Wieso muss immer ich auf sämtliche Ausnahmen stoßen?
Danke für den Hinweis