您沒有爲ddj
分配任何內存。由於它是一個局部變量,因此它被分配在堆棧上。局部變量默認情況下不初始化爲0/false/NULL,所以聲明後立即值ddj
是未定義的 - 它將具有堆棧中特定位置的內存中剩餘的值。任何取消引用的嘗試(即讀取或寫入它所指向的內存)都會導致未定義的行爲。在你的情況下,它會崩潰,因爲它指向一個無效的地址。
要解決該問題,您需要爲ddj
分配存儲空間。您可以在堆棧上分配靜態存儲,也可以在堆上動態存儲。要分配靜態存儲,這樣做:
// Allocate 64 bytes for ddj. It will automatically be deallocated when the function
// returns. Be careful of buffer overflows!
char ddj[64];
分配動態存儲:
// Allocate 64 bytes for ddj. It will NOT be automatically deallocated -- you must
// explicitly deallocate it yourself at some point in the future when you're done
// with it. Be careful of buffer overflows!
char *ddj = new char[64];
...
delete [] ddj; // Deallocate it
而是自己管理存儲的,這將是一個更好的主意,用std::string
,這與內存管理自動交易。
最後,因爲你所做的只是比較字符串的前三個字符,所以不需要跳過複製字符串並比較它。只需使用strncmp()
:
if(strncmp(buffer, "JMX", 3) == 0)
{
...
}
如果您發佈了一個問題,說明您實際正在嘗試做什麼,我們可以爲您提供最佳且簡單的C++方法。你現在正在使用次優的,坦率的錯誤的C做法。 – 2009-05-17 17:43:51
再次談到顯式內存管理時,大多數答案在技術上是不正確的。一個強烈的跡象表明,應該使用std :: vector或std:; string,我想。 – 2009-05-17 17:52:59