編輯:實施詹姆斯霍普金的建議後,我仍然得到「無效名稱null」的警告,這比那些奇怪的字符好得多。然後,我又回到了庫文檔中,結果發現,對於那個特定的函數,它的參數應該有一個非空字符串的元素,而不是一個名稱的大小。額外的字符串有其他目的。增加一個字符串後,代碼運行良好。這都是我的錯,我很抱歉。如何將字符串的向量傳遞給foo(char const * const * const)?
原帖:
嗨,
這是我的第一篇文章,所以請好的。我在這個論壇搜索和搜索,但我仍然無法找到答案。這個問題困擾了我超過一天,所以請給我一些幫助。謝謝。
我需要將一個字符串向量傳遞給庫函數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亂扔一些警告非法字符('èI'blablabla)在aR。
如果我之前函數foo這樣的打印AR:
std::copy(aR, aR+rowNames.size(),
std::ostream_iterator<const char*>(std::cout, "\n"));
foo(aR);
然後,一切都很好。 我的問題是:
是否轉換將導致不確定的行爲?如果是這樣,爲什麼?
將字符串向量傳遞給foo(char const * const * const)的正確方法是什麼?
+1好猜測。事實上,爲'foo'函數查找數組大小的唯一方法是找到空指針。 – 2010-05-21 16:28:08
是的,很好的猜測!除非foo函數簽名不是真正的函數簽名。 @ user347208:那是確切的函數簽名嗎? – neuro 2010-05-21 16:33:54
非常感謝您的幫助! @neuro:確切的函數簽名是int foo(const char * filename,char const * const * const rowNames,char const * const * const columnNames)。但是,正如我在本版中所說的,我很抱歉,我沒有仔細閱讀文件,浪費了時間。無論如何,非常感謝你的幫助! – EXP0 2010-05-21 19:21:16