0

从我的 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 DB 教程混为一谈,但后来我也想做

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

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

4

3 回答 3

4

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

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

由于该值几乎可以肯定不是有效指针,因此这会导致您的段错误。相反,您可能想要:

memcpy(databuf, &smallest, sizeof smallest);

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

memcpy(databuf, key.data, sizeof(int));
于 2012-06-19T01:57:06.930 回答
4
(void *)smallest

它采用 minimum 的整数值并将其视为指针。你的意思是这样的:

(void *)&smallest
于 2012-06-19T01:57:43.053 回答
2

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

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

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

你可能想要:

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

此外,这是可疑的:

smallest=*(int *)key.data;

smallest保证整数对齐?

于 2012-06-19T01:56:20.863 回答