memcpy Seg故障看似很狡猾

时间:2012-06-19 01:53:18

标签: c berkeley-db memcpy

从我的memcpy中得到一个seg错误,gdb不能给我任何其他内容(至少超出了我知道如何使用gdb的简单方式......)。使用Berkely DB在一些代码中深深地嵌入了这个东西;我已经拿出了应该有用的唯一一行。

  void *databuf;
  int smallest;
  databuf=malloc(2*sizeof(int));
  memset(databuf,0,2*sizeof(int));



  /* This next line comes from the DB structures; key.data is a void*... */
  smallest=*(int *)key.data;

  memcpy(databuf,(void *)smallest,sizeof(int));

要确认变量minimum是正确的,我可以运行gdb并获取

(gdb) print smallest
$1 = 120321

我收到的错误(在gdb中)是没用的

Program received signal SIGSEGV, Segmentation fault.
0x08048efa in main (argc=4, argv=0xbffff344) at index_DB-1.1.c:128
128       memcpy(databuf,(void *)smallest,sizeof(int));
(gdb) backtrace
#0  0x08048efa in main (argc=4, argv=0xbffff344) at index_DB-1.1.c:128

我这样做的原因主要是因为我正在粘贴Berkley数据库教程,但后来我也想这样做

memcpy(databuf+len,(void *)largest,sizeof(int));

即。有一个void指针databuf,第一个byes是最小整数,第二个字节是最大整数。我错过了什么?

3 个答案:

答案 0 :(得分:4)

在此步骤中,您将smallest中的值解释为指针:

memcpy(databuf,(void *)smallest,sizeof(int));

由于该值几乎肯定是而不是一个有效的指针,这会导致你的段错误。相反,你可能想要:

memcpy(databuf, &smallest, sizeof smallest);

除非您出于其他原因需要smallest,否则您可以直接从key.data复制到databuf

memcpy(databuf, key.data, sizeof(int));

答案 1 :(得分:4)

(void *)smallest

采用最小的整数值并将其视为指针。你打算这样做:

(void *)&smallest

答案 2 :(得分:2)

考虑到代码非常糟糕,很难说出你在做什么,但这看起来非常可疑:

memcpy(databuf,(void *)smallest,sizeof(int));

我相信smallest包含正常的整数数据,而不是指向任何东西的指针。那你为什么要解除引用呢?它没有任何意义。

你可能想要:

memcpy(databuf,(void *) &smallest,sizeof(int));

此外,这是可疑的:

smallest=*(int *)key.data;

smallest是否保证整数对齐?