以下代码尝试将字符串 c 的内容放入 arg[0]。
const char **argv = new const char* [paramlist.size() + 2];
argv[0] = c.c_str();
这是另一种方式。
argv[0] = "someprogram"
我注意到稍后在我的程序中,第二种方法有效,但第一种方法会导致错误。可能有什么不同?如何更改第一种方式使其正常工作?
这是问题发生的地方:
execvp(c.c_str(), (char **)argv);
如果我将其更改为以下内容,则不会出现该问题。这是为什么?
execvp(argv[0], (char **)argv);
最佳答案
在这两种方式中,你都保持 const char*
argv[0]
中的指针.所以唯一关心的是指针是否有效并指向以零结尾的字符串。
“someprogram”指针在程序执行期间有效并指向以零结尾的字符串。
c.c_str()
指针从返回(通过 std::basic_string::c_str() 函数)到字符串 c
的那一刻保证有效被更改或销毁。因此,如果您访问字符串 c
显式或隐式地使用任何非常量函数(包括其析构函数)存储到 argv[0]
中的指针很可能会失效。
添加:
显然要制作argv[0] = c.c_str();
变体工作正常,你必须使用 argv
仅在std::string c
范围内(其中 c
存在)并且不要更改 c
在您进行此分配后以任何方式 ( argv[0] = c.c_str();
)。
关于c++ - 这个变量赋值有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5800761/