2011-04-27 20 views
0

以下代碼嘗試將字符串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); 
+3

你可以發佈包含'c'變量聲明的代碼嗎? – 2011-04-27 07:27:17

+0

這只是字符串c。 – 2011-04-27 07:30:07

+1

@z_buffer:我問,因爲*你在哪裏*就你的問題中的代碼聲明它實際上是非常重要的。你能否提供一個代碼片段,其中包括你現在問題中的內容,'string c;'聲明,以某種方式修改'c'的任何代碼,以及你如何訪問'argv'? – 2011-04-27 07:30:58

回答

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;          
} 
+0

您可能想要提到的是,如果您確實使用了_strdup,那麼它會分配內存來存儲該字符串的副本,並且調用者負責確保這不會導致內存泄漏。 – forsvarir 2011-04-27 07:42:50

+0

'strdup'修復了這個問題。你應該怎樣處理內存? – 2011-04-27 07:46:44

+0

是的,我知道:)但問題是,怎麼可能改變第一種方式,使其工作正確?當然你可以使用std :: string和std :: vector – hidayat 2011-04-27 07:48:27

1

在這兩種方式你保持const char*指針在argv[0]。所以唯一的問題是指針是否有效並且指向零終止的字符串。

「someprogram」指針是有效的,並在程序執行期間指向零終止的字符串。

c.c_str()指針保證從它返回的時刻(通過std :: basic_string :: c_str()函數)到字符串c被更改或銷燬的時刻有效。因此,如果您使用任何非const函數(包括其析構函數)顯式或隱式地訪問字符串c,則存儲到argv[0]中的指針可能會失效。

地址:

顯然以便正確argv[0] = c.c_str();變種工作,你必須只在std::string c(其中c存在)範圍內只使用argv您在本任務後,不以任何方式改變cargv[0] = c.c_str();)。

相關問題