2013-02-05 71 views
0

我寫了一個程序,它有一個類,它應該從命令行參數中複製一個字符串。在Linux上工作,在Windows 7上崩潰

這裏是有問題的一段代碼。

void FileHandler::SetFile(const char*& filename) 
{ 
    for(unsigned tsr = 0; tsr < 200; tsr ++){ 
     if(filename[tsr] == 0x0){ 
      mFilename = new char[tsr]; 
      strcpy(mFilename, filename); 
      mFilenameAllocated = true; 
     } 
    } 
} 

我假定一個命令參數以NULL終止的,因此這個代碼塊尋找一個空字符找到字符串的長度,memcpy'ing成一些新的內存空間之前。

我忽略了什麼?還是應該這個代碼「只是工作」?

感謝

編輯:

是它的strcpy的錯嗎?如果命令參數不是NULL終止的,它是否會沿着一段內存運行,直到它導致訪問衝突?

+2

如果這是C++,爲什麼這麼難?使用'std :: string'。 – chris

+1

如果你的字符串少於200個字符,如果它不是以任何方式崩潰,你正在迭代字符串的末尾 –

+0

是的,200是一個'瘋狂'的上限,永遠不會超過。 – user3728501

回答

0

問題1:

找到NULL字符後,for循環不會'中斷'。這意味着它有時會顯示未定義的行爲。 (編碼時間過長時,這是一個問題。)

問題2:

存儲器分配是1個字符的兩個短。

編輯:

投稿者已被+1上傳。

3

您分配的字符串是一個字符太短。

試想輸入"A"。然後,您將在索引1處找到0x0,並分配一個字符。然後strcpy將複製A和空終止符,並註定。

+0

啊,是的,它似乎現在工作。謝謝 - 簡單的錯誤 – user3728501

+0

製作字符串後,你也沒有從函數返回。你總是會去200個字符,你可以找到更多的空字符。 – Falmarri

+0

@Falmarri非常真實。似乎我很難找到更明顯的錯誤:( – Timbo