使用memcmp时的Segfault

时间:2014-02-13 12:26:03

标签: c segmentation-fault

我想比较十六进制中的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

4 个答案:

答案 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;
}

http://ideone.com/EQH6py

答案 2 :(得分:0)

如果您的进程没有0x00003336的内存,那么您将获得未定义的行为:在此特定实例中表现为段错误。

这里要做的通常是将指针传递给你自己实例化的变量。

答案 3 :(得分:0)

memcmp()的前两个参数都必须是指向内存的指针。您似乎传递了要比较的值,而不是指向该值的指针。

相反,试试这个:

unsigned short expectedValue = 0x3336;
if (memcmp (msgType, &expectedValue, 2) == 0){}