c - memcpy 段错误看似无害

标签 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));

为了确认变量 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/

相关文章:

c - memcpy 类似继承的结构 - 安全吗?

c++ - 为什么 memcpy 无法复制到简单对象的本地数组成员?

c - 存储在有一些空格的数组中

c - 使用 Objective-C 中的 libmms

C函数签名问题

linux - 我该如何修复这个损坏的 rpmdb?

c - 无法用 C 语言从 Berkeley DB 检索值

berkeley-db - 将 Rust 与 Berkeley DB 连接起来

c - 如何比较C中链表中的每个项目?

c - fgets 函数被完全忽略