私は次のように割り当てられた構造を持っています:
static struct cparray_buffer_t *_cparray;
struct __attribute__ ((__packed__)) cparray_buffer_t
{
u_int64_t buflen;
u_char buf[buffersize];
}
.
.
.
_cparray = (struct cparray_buffer_t *)calloc(1024, sizeof(struct cparray_buffer_t);
そして後でプログラムで私はそのようにmemcpyをやろうとします
memcpy(_cparray[0].buf, test, buffersize);
そして、私はsigsegvを取得します
memcpy で正しく参照していますか?
編集: gdb では、配列を実際に使用するときに _cparray のアドレスが 0x0 のようです。_cparray にデータ ウォッチポイントを配置しようとしましたが、それを解放するものは何もありません。興味深いことに、&_cparray を監視すると、まだ有効なアドレスがありますが、*&_cparray は 0x0 です。
edit2: 違いがあるかどうかはわかりませんが、calloc はスレッド 1 にあり、segfault はスレッド 2 で発生しています。ただし、グローバルな統計はすべてのスレッドに表示されるという印象を受けました。これは正しいです?
ありがとう
何が起こっている?
_cparray のウォッチポイントからの出力は次のとおりです。
Old value = (struct cparray_buffer_t *) 0x284ba000
New value = (struct cparray_buffer_t *) 0x0
0x28102c83 in sem_init () from /lib/libc.so.7