0

私のmemcpyから、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 のチュートリアルを荒らしているためですが、後でやりたいこともあります。

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

つまり、最初のバイトが最小の整数で、2 番目のバイトが最大の整数である void ポインター databuf があります。私は何が欠けていますか?

4

3 に答える 3

4

この手順では、値を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

これは、最小の整数値を取り、それをポインターとして扱います。あなたがするつもりだったのはこれです:

(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 に答える