簡體   English   中英

我如何以可靠的方式將 std::vector 轉換為 char **?

[英]how do i convert std::vector to char ** in a reliable way?

我一直在嘗試避免使用 char ** 數組,但是因為我使用的是 execvp,所以我編寫了一個方法將字符串向量轉換為空終止的 char **。

不幸的是,直到最近我才遇到分段錯誤,這讓我懷疑我的方法由於某種原因並不總是有效:

void vectorToNullArray(std::vector<std::string> const &v, char **a) {
  int i = 0;
  while (i < v.size()) {
    std::string str = v[i];
    char *cstr = new char[str.size()+1];
    strcpy(cstr, str.c_str());
    a[i] = cstr;                       // <-- segfault here
    i++;
  }
  a[i] = nullptr;
}

如果我首先可以完全擺脫 char **,那將是理想的。 為什么這段代碼會出現段錯誤?

編輯:這就是我所說的:

  char **argvA;
    vectorToNullArray(_ARGV, argvA);

其中_ARGVstd::vector<std::string> ,某個類的成員變量。

編輯 2:工作解決方案

std::vector<char *> nullTerminatedArgV(std::vector<std::string> const &v) {
  std::vector<char *> result;
  for (auto const &s : v) {
    result.push_back(const_cast<char *>(s.c_str()));
  }
  result.push_back(nullptr);
  return result;
}

與 execvp 一起使用:

    std::vector<char *> argv = nullTerminatedArgV(_ARGV);
    char **command = argv.data();

      int status = execvp(command[0], command);
      perror("execvp error");

基本上是公認的答案,從這里補充:

https://stackoverflow.com/a/47714627/5133238

正如皮特貝克爾所說,問題可能是你沒有正確調用它 - 特別是a參數沒有指向足夠大的char*數組來寫入。

無論如何,您真的需要在這里進行動態內存分配嗎? std::vector為您管理內存更容易、更安全、更簡潔。 也許您可以執行以下操作,然后將結果的.data()值傳遞給execvp 您確實需要確保在此調用之后和調用execvp之前,作為參數傳遞的字符串向量不會被調用者改變,否則您收集的指針可能會失效。

std::vector<const char*> getVectorOfPointersToStrings(std::vector<std::string> const& v) {
    std::vector<const char*> result;
    for (const auto& s : v)
        result.push_back(s.c_str());
    result.push_back(nullptr);
    return result; 
}
char **argvA;
vectorToNullArray(_ARGV, argvA);

argvA有一些隨機值; 將它傳遞給vectorToNullArray導致未定義的行為。

代碼不會分配數組本身,而是為其分配值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM