memcpy Seg故障看似无害

memcpy Seg故障看似无害,c,berkeley-db,memcpy,C,Berkeley Db,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

从我的记忆中得到一个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));
为了确认变量最小值是正确的,我可以运行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教程进行bastardizing,但我以后也想这么做

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

i、 e.有一个空指针databuf,第一个是最小的整数,第二个字节是最大的整数。我遗漏了什么?

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

memcpy(databuf,(void *)smallest,sizeof(int));
我相信最小值包含正常的整数数据,而不是指向任何东西的指针。那你为什么要取消对它的引用?它没有指向任何东西

您可能需要:

memcpy(databuf,(void *) &smallest,sizeof(int));
此外,这是可疑的:

smallest=*(int *)key.data;

是否保证最小值是整数对齐的?

在这一步中,您将最小值解释为指针:

memcpy(databuf,(void *)smallest,sizeof(int));
由于该值几乎肯定不是一个有效指针,因此这会导致SEG错误。相反,您可能希望:

memcpy(databuf, &smallest, sizeof smallest);
除非出于其他原因需要,否则您可以直接从key.data复制到databuf:

它接受最小值的整数值并将其视为指针。你想做的是:

(void *)&smallest

事实上,你认为错误信息是无用的是一个大线索,你错过了什么。换句话说,您丢失了错误消息实际提供给您的信息:哈哈,我在想口语中的无用这个词。我知道seg故障可能意味着某种无效的内存条目,这是有用的信息。。。但更有用的信息将是无效的。最小的不是有效的指针,你这个白痴!我很感激,尽管答案很简单。我实际上认为casting void*会将最小值复制到databuf指向的内存中。这表明我对这些事情的理解不如我想象的那样好。谢谢
(void *)smallest
(void *)&smallest