I'm having problems in Visual Studio 2003 with the following:
void foo(const char*& str, ...) {
va_list args;
va_start(args, str);
const char* foo;
while((foo = va_arg(args, const char*)) != NULL) {
printf("%s\n", foo);
}
}
When I call it:
const char* one = "one";
foo(one, "two", "three", NULL);
I get:
Access violation reading location 0xcccccccc
on the printf()
line -- va_arg()
returned 0xcccccccc. I finally discovered it's the first parameter being a reference that breaks it -- if I make it a normal char* everything is fine. It doesn't seem to matter what the type is; being a reference causes it to fail at runtime. Is this a known problem with VS2003, or is there some way in which that's legal behavior? It doesn't happen in GCC; I haven't tested with newer Visual Studios to开发者_运维技巧 see if the behavior goes away
VS2005 also crashes on it.
The problem is that va_start uses the address of the argument given to it, and since str is a reference, its address is the address of the "one" variable defined int the caller, not the address on the stack.
I see no way of getting the address of the stack-variable (the argument that actually contains the address of "one" that is being passed), but there are some work arounds:
- Instead of "const char * &str", use "const char *str" or "const char **str"
- Add the next argument also to the "fixed" argument list
This code illustrates the second alternative:
void foo(const char* &str, const char *arg1, ...) {
if (arg1) {
va_list args;
va_start(args, arg1);
printf ("%s\n", arg1);
const char* foo;
while((foo = va_arg(args, const char*)) != NULL) {
printf("%s\n", foo);
}
}
}
精彩评论