2012-07-25 172 views
-3

代碼:垃圾值

char* data = NULL; 
data = new char[lengthOfParam]; //lengthOfParam = 3 
           //after allocation **data = ¥¥¥¥Ü\r** 
memcpy(data,&buffer[offset],lengthOfParam); //**data = pki¥Ü\r** 

爲什麼我收到的垃圾值???如何避免或消除這些多餘的值(BCS),如果我試圖將其值分配給任何其他陣列 例如:

obj[1] = data; 

然後用junk'll整個價值被分配到該變量。

+1

什麼是「緩衝區」?什麼是'lengthOfParam'? – 2012-07-25 13:31:58

+4

C中沒有新操作符。 – wildplasser 2012-07-25 14:33:45

+0

buffer是LVParams(char * buffer,int offset,signed char * codeWord)中的參數,lengthOfParam是int類型的參數。 – poppy 2012-07-26 04:56:11

回答

2

C中的字符串需要NUL終止。這意味着您需要在字符串的末尾添加一個零值字節來指示字符串的結尾。因爲在查看/打印正在讀取的值時,沒有任何字符串結束的跡象,因此您可以將數組尾部的值讀取到後面的任何內存中。

如果源數據包含一個NUL終止子可以簡單地分配和複製1更字節,但假設它是一個沒有NUL終止一個固定長度字段則需要手動添加一個:

data = new char[lengthOfParam+1]; 

memcpy(data, &buffer[offset], lengthOfParam); 
data[lengthOfParam] = 0; 

另外進一步看這行你貼:

obj[1] = data; 

我也許錯在這裏和抱歉,如果我是,但我強烈懷疑該行沒有做什麼,你認爲它是。這將在obj[1]中存儲一個指向您的字符串的指針,不會複製字符串中的數據。因此,如果您刪除dataobj[1]也不再有效。

+0

你可能是正確的,但是當我從這個方法返回obj像這樣char ** LVParams(char * buffer,int offset,signed char * codeWord)\t函數調用:char ** sss = LVParams(arr1,0,code_word_arr);所以在這裏,當我檢查像這樣我得到正確的值\t char * s1 = sss [0]; char * s2 = sss [1]; – poppy 2012-07-26 05:02:13

+0

我試着在分配結束符後得到確切的值後提示其正確。謝謝Charles Keepax。 – poppy 2012-07-26 06:57:51

1

這是C還是C++?

在包含new的語言,也可以做

std::string data(&buffer[offset], lengthOfParam); 

假設buffer是字符數組。

+0

緩衝區是char *類型的緩衝區。 – poppy 2012-07-26 04:59:41