Чем отличается назначение этой переменной? - PullRequest
0 голосов
/ 27 апреля 2011

Следующий код пытается поместить содержимое строки c в arg [0].

const char **argv = new const char* [paramlist.size() + 2];
argv[0] = c.c_str();

Это еще один способ сделать это.позже в моей программе второй способ работает, но первый вызывает ошибку.Что может быть другим?Как можно изменить первый способ, чтобы он работал правильно?

Вот где возникает проблема:

execvp(c.c_str(), (char **)argv);

Если я изменю его на следующее, проблема не возникнет,Почему это?

execvp(argv[0], (char **)argv);

Ответы [ 2 ]

1 голос
/ 27 апреля 2011

В обоих случаях вы сохраняете const char* указатели в argv[0]. Таким образом, единственная проблема заключается в том, действительны ли указатели и указывают ли они на строку с нулем в конце.

Указатель «someprogram» действителен и указывает на строку с нулем в конце во время выполнения программы.

c.c_str() указатель гарантированно действителен с момента его возврата (с помощью функции std :: basic_string :: c_str ()) до момента, когда строка c изменена или уничтожена. Поэтому, если вы обращаетесь к строке c явно или неявно с помощью любой неконстантной функции (включая ее деструктор), указатель, сохраненный в argv[0], скорее всего станет недействительным.

ADD:

Очевидно, что для правильной работы варианта argv[0] = c.c_str(); необходимо просто использовать argv только в области действия std::string c (где существует c) и никоим образом не изменять c после выполнения этой операции. назначение (argv[0] = c.c_str();).

1 голос
/ 27 апреля 2011

Вы можете использовать _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;                                    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...