如何将void *转换为size_t?

时间:2013-10-30 08:47:31

标签: c++ parameters casting pthreads

我有一个这个线程的计时器线程和函数,必须将参数size_t传递给函数。

void* global::timer_event::entry_point(void* n)
{
    namespace N = global::utils;
    struct timeval tv;
    size_t* s = (size_t*)n;     
    N::set_timer(tv, *s);
    while(1)
    {
        if (N::check_timer(tv, *s) == 1)
        {
            pthread_mutex_lock(&set_queue_mutex);
            N::print_queue(q);
            pthread_mutex_unlock(&set_queue_mutex);
        }
    }
}

void global::timer_event::run(size_t n)
{
    pthread_create(&m_t, 0, &entry_point, (void*)n);
}

但该程序将在N::set_timer(tv, *s);行崩溃 也就是说,当你使用* s时。如何很好地进行这种转换?

3 个答案:

答案 0 :(得分:2)

你的第一个演员是来自 size_t

然后你将转换为 size_t*

这显然是错误的。

将其转回size_t

答案 1 :(得分:1)

pthread_create(&m_t, 0, &entry_point, (void*)n);

将n的值传递给threadFunc。 例如,如果n = 0(或其他值),则在这些语句中:

size_t* s = (size_t*)n;     
N::set_timer(tv, *s);

*(s = 0)==>在地址==>处访问地址0x0(或其他受保护的内存)==>访问冲突碰撞~~ BOOM ~~

答案 2 :(得分:0)

创建线程时,按值传递变量n ,但在线程函数中将其用作指针。你需要在线程函数中将它作为而不是指针。