C-指向指针的指针问题,can';我好像没看见

C-指向指针的指针问题,can';我好像没看见,c,pointers,C,Pointers,好了,伙计们,我想问一个简单的问题,希望有人能很快发现我的错误,但我现在看不出来 这是我的结构: typedef struct { Car *buffer[CAR_PARK_SIZE]; char *arrival_time[CAR_PARK_SIZE]; int keep_running; int size; } CarPark; typedef struct { C

好了,伙计们,我想问一个简单的问题,希望有人能很快发现我的错误,但我现在看不出来

这是我的结构:

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缓冲区中的ever项,下面是按次播放

_cq=停车场,cp=停车场

他们都是全球性的

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

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缓冲区

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

我认为问题在于代码中的注释在哪里,但我不确定。最终,如果我在停车场打印出阵列,它的所有项目似乎都是完全相同的。我是否意外地将错误指针传递到某个指针

如果我遍历停车场数组并像下面那样打印出来

printf("| element %d is  %s with pointer %d |\n", j, get_car_id(_cp.buffer[j]), _cp.buffer[j]);
它们看起来都是完全相同的项目、相同的名称和指针。

问题在于:

Car c;
c = new_car();
get_car_id(&c);
您将指针指向堆栈上的对象,所以每次都会删除/覆盖它,所以指针可以是相同的

Car *c;
c = new_car();
而新车应该返回指针

编辑:

新车应该放在新车上,(你需要把它放在某个地方,比如从队列中移出时)


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

示例中的Car是否已分配到堆栈上


线程之间共享的对象应该使用
malloc

在堆上分配这是否意味着新的\u car()方法必须malloc它才能停止它在堆栈中?此外,如果单独的线程在将正确的信息放入停车场之前将其从队列中拉出(同时仍在创建新车并将其添加到第一个线程的队列中),那么在某个点上仍然会有单独的指针。即使其中一个被核攻击,它也是一个空引用,它也不会神奇地指向另一个对象。。。对吗?如果您要将其用作队列(添加到并结束,从结束处删除),那么链表将是一个很好的数据结构。对于数组,必须知道大小(或者像以前一样使用常量)。链表很容易增长和缩小,而且您不会永远被限制在最大队列大小和停车场大小的数组中。
Car *c;
c = new_car();