指针的行为非常奇怪

时间:2014-05-11 08:01:37

标签: c pointers

如果你知道这背后的实际问题,请编辑标题。 我用C中的指针面对一个非常奇怪的行为。

版本1(我想要的但是输出不是我期望的):

void *partial_evolve(void * pars)
{
    evolve_pars *p = (evolve_pars*)pars;
    unsigned char *in = *p->grid_in;
    unsigned char *out = *p->grid_out;

    for (int t = 0; t < p->time_steps; ++t)
    {
       for (int y = 0; y < p->dim_y; ++y)
         for (int x = p->start_x; x < p->end_x; ++x)
           evolve(in, out, p->dim_x, p->dim_y, x, y);

       swap(&in, &out);
       pthread_barrier_wait(&barrier);
    }
}

版本2(输出正确,但我必须使用两个我不想要的等待):

void *partial_evolve(void * pars)
{
    evolve_pars *p = (evolve_pars*)pars;

    for (int t = 0; t < p->time_steps; ++t)
    {
       for (int y = 0; y < p->dim_y; ++y)
         for (int x = p->start_x; x < p->end_x; ++x)
           evolve(*p->grid_in, *p->grid_out, p->dim_x, p->dim_y, x, y);

       pthread_barrier_wait(&barrier);
       swap(p->grid_in, p->grid_out);
       pthread_barrier_wait(&barrier);
    }
}

我使用的输入结构是:

typedef struct
{
    unsigned int dim_x;
    unsigned int dim_y;
    unsigned char **grid_in;
    unsigned char **grid_out;
    unsigned int start_x;
    unsigned int end_x;
    unsigned int time_steps;
    int is_master_thread;
} evolve_pars;

交换功能:

void swap(unsigned char **a, unsigned char **b)
{
    unsigned char *tmp = *a;
    *a = *b;
    *b = tmp;
}

无论代码的其余部分如何,在两种情况下,partial_evolve函数的指针操作都应该表现相同。 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在第一个版本中,使用2个本地指针的地址调用swap()函数。

swap(&in, &out);

在第二个版本中,参数是结构的一部分

swap(p->grid_in, p->grid_out);