这个变量赋值有什么不同?

时间:2011-04-27 07:24:39

标签: c++ arrays string variables

以下代码尝试将字符串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);

2 个答案:

答案 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();变体正常工作,您必须仅在argvstd::string c存在的地方)范围内使用c并且不要更改{{ 1}}以任何方式完成此作业(c)。