我有一个这样分配的结构:
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在thread1中,而segfault在thread2中发生。我的印象是全局静态对所有线程都是可见的。这个对吗?
谢谢
到底是怎么回事?
这是 _cparray 上的观察点的输出
Old value = (struct cparray_buffer_t *) 0x284ba000
New value = (struct cparray_buffer_t *) 0x0
0x28102c83 in sem_init () from /lib/libc.so.7