【问题标题】:C - Problems with pointers to pointers, can't seem to see itC - 指向指针的问题,似乎看不到
【发布时间】:2009-09-09 11:17:23
【问题描述】:

好的,伙计们,只是一个简短的问题,希望有人能很快找到我的错误,但我现在看不到它

这是我的结构:

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 = 停车场

它们都是全局变量

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

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]);

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

【问题讨论】:

  • 如果您打算将其用作队列(添加到末尾,从末尾删除),那么链表将是一个很好的数据结构。对于数组,您必须知道大小(或像您一样使用常量)。链表很容易扩展和收缩,你不会永远被限制在 MAX_QUEUE_SIZE 和 CAR_PARK_SIZE 大小的数组中。

标签: c pointers


【解决方案1】:

问题就在这里:

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

您将指针指向堆栈上的对象,因此每次都将其删除/覆盖,因此指针可以相同。

Car *c;
c = new_car();

new_car 应该返回指针。

编辑:

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

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

【讨论】:

  • 这是否意味着 new_car() 方法必须对其进行 malloc 以阻止其进入堆栈?此外,如果单独的线程在将其放入公园之前将正确的信息从队列中拉出(同时仍在创建新车并将其添加到第一个线程中的队列中),那么在某些时候仍然是单独的指针。即使一个被核了,它也是一个空引用,它不会神奇地指向另一个对象......对吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多