从我的 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));
为了确认变量 smallest 是正确的,我可以运行 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));
即有一个 void 指针 databuf,第一个字节是最小整数,第二个字节是最大整数。我错过了什么?
最佳答案
在这一步中,您将 smallest
中的值解释为指针:
memcpy(databuf,(void *)smallest,sizeof(int));
由于该值几乎肯定不是有效指针,因此这会导致您的段错误。相反,您可能想要:
memcpy(databuf, &smallest, sizeof smallest);
除非出于某些其他原因需要smallest
,否则您可以直接从key.data
复制到databuf
:
memcpy(databuf, key.data, sizeof(int));
关于c - memcpy 段错误看似无害,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11093406/