编辑: 在实施James Hopkin的建议后,我仍然收到“无效名称'null'”的警告,这比那些奇怪的字符要好得多。然后,我回头再次阅读了库文档,结果发现对于该特定函数,它的参数应该比aNames的大小多一个非NULL字符串元素。这个额外的字符串有一些其他的目的。添加了一个字符串后,代码运行良好。这全是我的错,我非常抱歉。
原帖:
您好,
这是我第一次发帖,请多关照。我在论坛中搜索并谷歌过,但仍然找不到答案。这个问题已经困扰我一天以上了,请给我一些帮助。谢谢。
我需要将一个字符串向量传递给一个库函数foo(char const *const *const)。我不能传递&Vec[0],因为它是一个指向字符串的指针。因此,我有一个数组,并将c_str()传递给该数组。以下是我的代码(aNames是字符串向量):
const char* aR[aNames.size()];
std::transform(aNames.begin(), aNames.end(), aR,
boost::bind(&std::string::c_str, _1));
foo(aR);
然而,它似乎会导致一些未定义的行为:
如果我运行以上代码,则函数foo会抛出一些警告,指出aR中存在非法字符('èI'等等)。
如果我在函数foo之前像这样打印aR:
std::copy(aR, aR+rowNames.size(),
std::ostream_iterator<const char*>(std::cout, "\n"));
foo(aR);
然后,一切都好了。
转换是否会导致未定义行为?如果是,为什么?
将字符串向量传递给foo(char const *const *const)的正确方法是什么?