gpt4 book ai didi

c - 指针的行为非常奇怪

转载 作者:行者123 更新时间:2023-11-30 15:33:45 24 4
gpt4 key购买 nike

如果您知道这背后的实际问题,请编辑标题。我在 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函数的指针操作都应该表现相同。有什么想法吗?

最佳答案

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

swap(&in, &out);

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

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

关于c - 指针的行为非常奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23590362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com