Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1043
  • Last Modified:

va_arg problem

I am trying to create a function with a variable argument list. But, the code I have written (see below) is not giving me the first argument of the variable argument list.

The output to the program should be:

1
2
3

but I am getting

2
3
0

where the last value is out of bounds for the ap pointer. I used gcc 4.3.2 and intel ia32 11.0 compilers on Mac OS X 10.5.6, and got the same results on both.

I found that if I add the following line before the first call to va_arg() that I will get the correct output:

ap -= sizeof(size_t);

but I should not need to manually change the pointer before using it.

What am I doing wrong and how can I fix it?

Thank you in advance.
#include <iostream>
#include <stdarg.h>
 
void vatest(const unsigned int n, const size_t args, ...) {
  size_t x;
  va_list ap;
  va_start(ap, args);
 
//  ap -= sizeof(size_t); // I should not need this line!
  for(unsigned int i = 0; i < n; ++i) {
    x = va_arg(ap, size_t);
    std::cout << x << std::endl;
  }
 
  va_end(ap);
}
 
int main() {
  vatest(3, 1, 2, 3);
  return 0;
}

Open in new window

0
gandalf79
Asked:
gandalf79
  • 4
  • 2
1 Solution
 
jkrCommented:
There is no need to use 'args' in your argument list, in fact this is what is causing the error. The last non-variable argument is 'n', so use this in 'va_start()', e.g.
#include <iostream>
#include <stdarg.h>
 
void vatest(const unsigned int n, ...) {
  size_t x;
  va_list ap;
  va_start(ap, n);
 
  for(unsigned int i = 0; i < n; ++i) {
    x = va_arg(ap, size_t);
    std::cout << x << std::endl;
  }
 
  va_end(ap);
}
 
int main() {
  vatest(3, 1, 2, 3);
  return 0;
}
 
Output:
 
$ vatest
1
2
3

Open in new window

0
 
wellholeCommented:
You're passing the parameters wrong. Get rid of argument args and use n as the size for va_start.
0
 
gandalf79Author Commented:
Thanks for the quick response. I made the following changes and it work perfectly now.

void vatest(const unsigned int n, ...) {
  // ...
  va_start(ap, n);
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
jkrCommented:
Um, may I ask what was wrong with my - a bit more complete - answer?
0
 
gandalf79Author Commented:
I am sorry, I accidentally over looked your solution. When I looked at it, I thought your code was my code. I will attempt to rectify the situation.
0
 
gandalf79Author Commented:
Please, I am looking but I don't see how I can modify the accepted answer. =(

Had I not overlooked your solution, I would have given you credit for the question since yours is more complete. Thank you for your understanding.
0
 
gandalf79Author Commented:
Thank you for your help and the quick response.
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now