C - 指针指针的问题,似乎无法看到它

时间:2009-09-09 11:17:23

标签: c pointers

好的,只是一个简单的问题,希望有人可以很快找到我的错误,但我现在看不到它

这是我的结构:

typedef struct {
    Car *buffer[CAR_PARK_SIZE];       
    char *arrival_time[CAR_PARK_SIZE]; 
    int  keep_running;               
    int  size;                  
} CarPark;

typedef struct {
    Car *buffer[MAX_QUEUE_SIZE];
    char *arrival_time[MAX_QUEUE_SIZE];
    int keep_running;
    int size;
    int index;
    } CarQueue;

typedef struct {
    char str[3];
    int id;
} Car;

我会试着说出来,希望我已经为某人提供了足够的信息来找出问题所在,问题是如何处理CarQueue缓冲区中的指针,这是一个数组汽车指针。当我的代码运行时,它似乎在CarQueue缓冲区中写入了相同的指针,这里是播放游戏。

_cq = CarQueue,_cp = CarPark

它们都是全局的

我的线程调用这些行来生成一个新的汽车结构。

Car c;
c = new_car();
printf("[A] Car Arrived with ID: %s\n", get_car_id(&c));

pthread_mutex_lock(&mutex);
_cq.size++;
_cq.index++;
_cq.buffer[_cq.index] = &c;

pthread_mutex_unlock(&mutex);

这应该将新车结构的指针放入CarQueue缓冲区。

下一个线程,而不是尝试将指针从该数组中取出,并将其粘贴到自己的数组中,然后将其从旧数组中删除。 CarPark获取汽车的指针,将其放入存储阵列,然后将其从CarQueue中移除(或者在这种情况下,只需增加索引并稍后覆盖它)。

pthread_mutex_lock(&mutex);
_cp.buffer[_cp.size] = _cq.buffer[_cq.index]; //should take the pointer and put it into its own
printf("[C] Car Parked -> %s\n", get_car_id(_cp.buffer[_cp.size])); //gets the right information
_cp.size++;
pthread_mutex_unlock(&mutex);

我认为问题在于代码中的注释,但我不确定。最后,如果我在CarPark中打印出数组,那么它的所有项目似乎完全相同。我是否意外地将错误的指针传递到指针某处?

如果我遍历CarPark阵列并将其打印出来,如下所示

printf("| element %d is  %s with pointer %d |\n", j, get_car_id(_cp.buffer[j]), _cp.buffer[j]);

它们看起来都是完全相同的项目,同名和指针。

2 个答案:

答案 0 :(得分:3)

问题在这里:

Car c;
c = new_car();
get_car_id(&c);

你正在把指针放在堆栈上的对象上,所以它每次被删除/覆盖,所以指针可以是相同的。

Car *c;
c = new_car();

和new_car应该返回指针。

编辑:

new_car应该是malloc()新车,(并且你需要在某处释放(),例如从队列中删除时)。

考虑使用汽车数组(不是汽车上的指针数组),并复制整个项目。

答案 1 :(得分:0)

示例中的Car是否已在堆栈中分配?

线程之间共享的对象应使用malloc在堆上分配。