好吧,只是一個快速的問題,希望有人可以迅速找到我的錯誤,但我現在看不到它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緩衝區中寫入與任何項目相同的指針,這裏就是玩遊戲。
_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中打印出陣列,那麼所有項目看起來都完全一樣。我偶然地將一個錯誤的指針傳遞給了一個指針嗎?
如果我在停車場遍歷數組,並打印出來像下面
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大小的數組。 – Shizzmo 2009-09-09 11:59:42