从我的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是最小整数,第二个字节是最大整数。我错过了什么?
答案 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
是否保证整数对齐?