以下代码尝试将字符串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);
答案 0 :(得分:1)
您可以使用_strdup
:
const char **argv = new const char* [paramlist.size() + 2];
argv[0] = _strdup(c.c_str());
_strdup
分配内存来存储字符串的副本。完成字符串后,使用free()
返回内存。
_strdup
函数看起来像这样:
char *_strdup (const char *s) {
char *d = (char *)(malloc (strlen (s) + 1));
if (d == NULL) return NULL;
strcpy (d,s);
return d;
}
答案 1 :(得分:1)
在这两种方式中,您都会在const char*
中保留argv[0]
个指针。因此唯一需要关注的是指针是否有效并指向以零结尾的字符串。
“someprogram”指针有效,并在程序执行期间指向以零结尾的字符串。
c.c_str()
指针保证从返回(通过std :: basic_string :: c_str()函数)到字符串c
被更改或销毁的那一刻起有效。因此,如果使用任何非const函数(包括其析构函数)显式或隐式地访问字符串c
,则存储在argv[0]
中的指针可能会变为无效。
添加强>
显然,为了使argv[0] = c.c_str();
变体正常工作,您必须仅在argv
(std::string c
存在的地方)范围内使用c
并且不要更改{{ 1}}以任何方式完成此作业(c
)。