Ik heb een functie waar een variable aantal argument mee kan worden gegeven:
(kort samengevat...de belangrijkste code)
Het idee was dat format_string aan de hand van de argument list een string aan maakt. De bedoeling was dat vsnprintf 1 of meerdere keren word aan geroepen zodat buffer de juiste grootte kan worden gemaakt. Dit schijnt te werken op de meeste platforms.
Het probleem zit met op Linux x86-64 platform (GCC). Na de eerste vnsprintf blijkt de "pa" geen geldige informatie te bevatten. Nou kan dit ook wel kloppen, want dat wordt ook gezegd in de man pages:
"Consequently,the value of ap is undefined after the call. The application should call va_end(ap) itself afterwards."
De vraag waarom werkt het wel op 32 bit linux-gcc? Is de definitie van va_list net even anders waardoor er in vsnprintf met een copy van pa wordt gewerkt? Wat zegt de C/C++ standaard hier over?
(kort samengevat...de belangrijkste code)
code:
1
2
3
4
5
6
7
8
9
10
11
12
| char * maak_string(const char * fmt,...){
va_list pa;
va_start(pa,fmt);
format_string(fmt,pa);
va_end
}
char * format_string(const char * fmt,va_list pa){
char * buffer;
vsnprintf(buffer,sizeofbuffer,fmt,pa);
return buffer;
} |
Het idee was dat format_string aan de hand van de argument list een string aan maakt. De bedoeling was dat vsnprintf 1 of meerdere keren word aan geroepen zodat buffer de juiste grootte kan worden gemaakt. Dit schijnt te werken op de meeste platforms.
Het probleem zit met op Linux x86-64 platform (GCC). Na de eerste vnsprintf blijkt de "pa" geen geldige informatie te bevatten. Nou kan dit ook wel kloppen, want dat wordt ook gezegd in de man pages:
"Consequently,the value of ap is undefined after the call. The application should call va_end(ap) itself afterwards."
De vraag waarom werkt het wel op 32 bit linux-gcc? Is de definitie van va_list net even anders waardoor er in vsnprintf met een copy van pa wordt gewerkt? Wat zegt de C/C++ standaard hier over?