我所需要的只是strcpy()。
我想看看缓冲区(字节数组)的前三个字节是否为“JMX”字符串。
这是我到目前为止所做的:
char * ddj;
strcpy( ddj, buffer ); //buffer is BYTE[]
if ( strcmp( "JMX", ddj ) == 0 ) //check first three chars are "JMX"
{
buffer += 20; //increase the index with 20
size -= 20; //int
}
我在strcmp()行遇到异常。有什么问题?
我希望我用C#写这个:(
答案 0 :(得分:8)
这里出了问题:
答案 1 :(得分:6)
您没有为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)
{
...
}
答案 2 :(得分:2)
您尚未为ddj分配内存。使用new来分配内存。例如
char *ddj = new char[size]; //Allocate size number of chars
//do the required comaprisons
delete[] ddj; //Remember to release the memory.
另一方面,您可以使用标准字符串类的std :: string。
答案 3 :(得分:2)
您必须为ddj
分配新内存。要么声明为
char ddj[NAX_LENGTH];
或动态分配
char* ddj = new char[length]; // You must use delete[] to free the memory in the end.
更方便的选择是std::string
。
答案 4 :(得分:1)
首先,它崩溃了,因为ddj
没有指向任何东西。
其次,您不需要将数据从byte []复制到char *(它们基本上是相同的)。你可以这样做:
if (strncmp("JMX", reinterpret_cast<char*>(buffer), 3) == 0)
{
// Strings are equal, do what you want
}
答案 5 :(得分:0)
这是UB,因为ddj
没有指向任何东西。你需要分配内存:
char* ddj = new char[strlen(buffer) + 1];
请确保delete
使用delete[]
(而非普通delete
分配的内存std::string
。
您也可以使用通常安全的ddj
,因为您不必处理指针和内存分配。
但是,查看您的代码,buffer
似乎毫无用处。只需使用if ( strcmp( "JMX", buffer ) == 0 ) //check first three chars are "JMX"
{
buffer += 20; //increase the index with 20
size -= 20; //int
}
:
{{1}}
答案 6 :(得分:0)
如果你想strcmp ddj,你也可以先在缓冲区上做,然后在需要的时候复制缓冲区。
答案 7 :(得分:0)
您正在获取异常,因为变量'ddj'未初始化。它指向垃圾,所以谁知道你在哪里复制那个字符串...
但是,在比较它们之前,您并不需要复制字节。
if(strncmp("JMX", buffer, 3) == 0) // check if the first three characters are "JMX"
{
buffer += 20;
size -= 20;
}