C语言 使用内存时出现隔离错误



我想比较 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

memcmp()的前两个参数是指向要比较的内存块的指针。参见手册页,原型是:

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)
{
}

请注意,在上面交换的字节是假设您使用的是小端系统。

你需要

一个指针作为第二个参数,你不能只在那里传递一个十六进制值

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

如果你的进程不拥有0x00003336的内存,那么你将得到未定义的行为:在这个特定实例中,表现为段错误。

这里要做的正常事情是将指针传递给您自己实例化的变量。

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

相反,请尝试以下操作:

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

相关内容

  • 没有找到相关文章

最新更新