c++ 如何手动构造argv?(或:将字符串向量转换为`char**`)

bmp9r5qi  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(226)

我需要使用一个函数(dpdk提供的eal_setup),它接受argcargv作为参数,并且应该在main函数中首先调用,直接从应用程序的调用中获取argcargv
然而,由于其他原因,应用程序需要能够接受参数,并且eal_setup的一些参数我永远不需要从我设置的默认值更改。这就需要手动构造一个“假”argv,我的意思是一个char**类型变量,它包含我想要传递到eal_setup的任何信息。
所以,我最终要做的是,在用CLI11处理了真实的的argcargv之后,我构造了一个std::vector<std::string>,我通过一个函数将字符串向量中的信息转换为char**,然后将其与eal_setup一起使用。
我创建的函数不能工作,它可以编译,但是每当我试图以与argv相同的方式访问结果的元素时,我都会得到一个分段错误。

char** construct_argv(std::vector<std::string> std_argv){
    std::vector<char*> vec_argv;
    for (std::string str_arg : std_argv){
        vec_argv.insert(vec_argv.begin(), (char*)str_arg.c_str());
    }
    return vec_argv.data();
}

如何正确地将std::vector<std::string>转换为char**,以创建模拟argv

m2xkgtsf

m2xkgtsf1#

char** construct_argv(std::vector<std::string> std_argv){

std_argv是这个函数的一个参数。函数参数就像局部变量。当函数返回时,所有局部变量都被销毁。它们不再存在。它们不再存在。它们开始渴望峡湾。它们成为ex-object。
你的construct_argv仔细地构造了一个指向每个指针的向量,并返回它:

return vec_argv.data();

但是,当然,你得到了双倍的头痛作为你的奖励。vec_argv是另一个本地对象。它返回一个指向向量内部数据的指针。向量立即被销毁,因为这个函数返回。你留下了一个完全空的袋子,装满了指向被销毁对象的指针,它本身也被销毁了。
整个函数必须从头开始重新设计。有很多不同的方法可以正确地做到这一点。一种方法是通过引用传递std_argv,让调用者负责不让原始std::vector<std::string>超出范围并被销毁。然后返回vec_argv本身,让调用者负责获取其data()

(char*)str_arg.c_str()

因为C++11 std::stringdata()保证是空终止的,所以这也可以是str_arg.data()

相关问题