Edit: Thank you all very much for your help. Now I feel that I'm really stupid and I am so sorry to waste your time. After implementing James Hopkin' suggestion, I still get the warnings of "invalid name 'null'", which is much better than those weird characters. Then, I went back and read the library document again, and it turns out that for that particular function, it's argument should have one more element of non-NULL string than the size of aNames. That additional string has some other purpose. After adding one more string, the code runs fine. It's all my fault, and I am so sorry.
Original post:
Hi,
This is my first post so please be nice. I searched in this forum and googled but I still can not find the answer. This problem has bothered me for more than a day, so please give me some help. Thank you.
I need to pass a vector of string to a library function foo(char const *const *const). I can not pass the &Vec[0] since it's a pointer to a string. Therefore, I have an array and pass the c_str() to that array. The following is my code (aNames is the vector of string):
const char* aR[aNames.size()];
std::transform(aNames.begin(), aNames.end(), aR,
boost::bind(&std::string::c_str, _1));
foo(aR);
However, it seems it causes some undefined behavior:
If I run the above code, then the function foo throw some warnings about illegal characters ('èI' blablabla) in aR.
If I print aR before function foo like this:
std::copy(aR, aR+rowNames.size(),
std::ostream_iterator<const char*>(std::cout, "\n"));
foo(aR);
Then, everything is fine. My questions are:
Does the conversion causes undefined behavior? If so, why?
What is the correct way to pass vector of string to foo(char const *const *const)?
Thank you very much for your help!