凌晨05:00肮脏的黑客攻击。我犯了错误,SO ,通过FIFO在相同进程的线程之间传递指针的地址:
total_buf = (char*)malloc(msize);
// ...
long addr = (long)&total_buf;
// ...
write(fifo, buf, 128);
在接收器线程中收到指向total_buf的指针后,void* pt = (void*)addr;char* tbuf = (char*)pt;
我注意到缓冲区内容已更改,并且通过检查内存内容明确确认:(gdb) x/1024xb tbuf
。
出现这种情况的可能原因是什么 - 在多线程Qt +纯pthreads应用程序的插件尝试直接通信的环境中?出于某种原因,我觉得这不是一些明显的垃圾收集和事后,Linux线程正在使用共享进程内存,因此它没有地址不匹配,并且指针取消引用也看起来不错,。
答案 0 :(得分:5)
我猜你应该尝试:
long addr = (long)total_buf; /* removed & */
...因为你后来首先将addr转换为void *然后转换为char *。你的版本有addr是指向指针的长版本,而不是指向缓冲区的指针的长版本。
答案 1 :(得分:2)
addr
包含char **
而不是char *
这意味着您要发送指针变量的地址,而不是缓冲区本身的地址
稍后在您的线程代码中,您将回到char *
,这应该是char **
。这就是内存似乎被改变的原因。
顺便说一句:地址应该转换为size_t
而不是长。