2012-07-25 133 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