2017-10-18 51 views
-2

我正在創建命令提示符,並將用戶輸入作爲字符串並使用我創建的解析函數將其轉換爲char **。我看不出任何問題,但在我的提示符下運行一些命令後,我就開始陷入的「損壞的尺寸誤差VS prev_size 0x00c06738。這是我的解析功能。任何幫助,將不勝感激。創建命令提示符時從字符串轉換爲char **的問題

char** parse(string s){ 

    vector<string> commandvector; 
    istringstream iss(s); 

    for(string s; iss>>s;) 
     commandvector.push_back(s); 

    char** argv = new char*[commandvector.size() + 1]; 


    for(int i = 0; i<commandvector.size();i++){ 
     argv[i] = new char[commandvector[i].size()]; 
     strcpy(argv[i],commandvector[i].c_str()); 
    } 

    argv[commandvector.size() + 1] = NULL; 

    return argv; 
} 
+1

爲什麼你降級到char *當你已經有字符串? – Jodocus

+0

'argv [commandvector.size()+ 1] = NULL;'訪問數組超出範圍並調用*未定義的行爲* – UnholySheep

+0

感謝一噸,修復了一切 –

回答

0

如果你想用C風格的字符串,你必須要考慮到空終止字符。

雖然std::basic_string::c_str返回一個指向一個空結尾的(因爲C++ 11)字符數組,std::basic_string::size沒有按不計算空終止符,所以爲了分配足夠的內存,必須將1加回到返回值中。

此外,由於UnholySheep已經注意到,您正在訪問argv陣列以外的邊界,其最後一個元素是argv[commandvector.size()]