我想比较十六进制中的2个无符号字节。这就是我试过的:
if (memcmp (msgType , 0x00003336, 2 ) == 0){}
这是gcc为msgType打印的内容:
(gdb) x msgType
0x7fffffffbb84: 0x00003336
我遇到了段错误。我该如何解决?
我试过了:
const unsigned char broadcast[2] = {0x33, 0x36};
但是gdb显示:
(gdb) x broadcast
0x401e28 <broadcast>: 0x62723633
我需要:0x00003336
答案 0 :(得分:2)
memcmp()
的前两个参数是指针到要比较的内存块。 See the manual page,原型是:
int memcmp(const void *s1, const void *s2, size_t n);
您使用绝对地址0x00003336作为s2
的值,这似乎非常错误;在一般情况下,这不是有效的地址。
要解决此问题,您必须创建一个包含要比较的值的内存区域,并将指针作为第二个参数传递给它。尝试:
const uint8_t data[] = { 0x36, 0x33 };
if(memcmp(msgType, data, sizeof data) == 0)
{
}
请注意,假设您使用的是小端系统,则在上面交换字节。
答案 1 :(得分:1)
你需要一个指针作为第二个参数,你不能只在那里传递一个十六进制值
http://www.cplusplus.com/reference/cstring/memcmp/
可能有用的东西:
#include <stdio.h>
int main(void) {
unsigned char msgType[2] = {0x33, 0x36};
unsigned char your_value[2] = {0x33, 0x36};
// Make sure your_value is the same size of msgType
if (memcmp (msgType , your_value, sizeof(msgType)/sizeof(unsigned char) ) == 0){
printf("Yes, memory is equal at that address!");
}
return 0;
}
答案 2 :(得分:0)
如果您的进程没有0x00003336
的内存,那么您将获得未定义的行为:在此特定实例中表现为段错误。
这里要做的通常是将指针传递给你自己实例化的变量。
答案 3 :(得分:0)
memcmp()
的前两个参数都必须是指向内存的指针。您似乎传递了要比较的值,而不是指向该值的指针。
相反,试试这个:
unsigned short expectedValue = 0x3336;
if (memcmp (msgType, &expectedValue, 2) == 0){}