将std :: vector <char*>转换为c风格的参数向量arv

Mau*_*aus 5 c++ vector exec argv

我想准备一个老派的参数向量(argv)在函数中使用

int execve(const char*filename,char*const argv [],char*const envp []);

我用stl :: vector类试了一下:

std::string arguments = std::string("arg1");    
std::vector<char*> argv; 
char argument[128];
strcpy(argument, arguments.c_str());
argv.push_back(argument); 
argv.push_back('\0'); // finish argv with zero
Run Code Online (Sandbox Code Playgroud)

最后我将向量传递给execve()

execve("bashscriptXY",&argv [0],NULL)

代码编译但是argV被execve()"忽略"了.所以这似乎是错的,我正在尝试.我应该如何使用c ++以有效的方式构建argV?

ros*_*oft 5

请注意,这argv[0]始终是命令本身的名称.因此,如果要将1个参数传递给程序,则必须填充两个元素:

argv[0]应该是" bashscriptXY"(或任何你想要的......)
argv[1] = "your_argument"


jos*_*rry 5

我认为char [128]是多余的,因为字符串local将具有相同的生命周期,同样,尝试将程序添加为argv [0],如rossoft在他的回答中所说:

const std::string arguments("arg1");    
std::vector<const char*> argv;

argv.push_back("bashscriptXY");
// The string will live as long as a locally allocated char*
argv.push_back(arguments.c_str()); 
argv.push_back(NULL); // finish argv with zero

execve(argv[0], &argv[0], NULL);
Run Code Online (Sandbox Code Playgroud)

  • 对于"使用零完成argv",我更喜欢"argv.push_back(0)"或"argv.push_back(NULL)"."argv.push_back('\ 0')"会导致正确的结果,但会让你过多地思考这里发生的事情 - 并且存在将其误写为"argv.push_back("\ 0")的危险)"哪个会错... (2认同)