2009-09-09 78 views
1

好吧,只是一個快速的問題,希望有人可以迅速找到我的錯誤,但我現在看不到它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]); 

他們都似乎是完全相同的項目,相同的名稱和指針。

+0

如果你打算使用它作爲一個隊列(添加和結束,從結束中刪除),那麼鏈表將是一個很好的數據結構。對於一個數組,你必須知道大小(或像你一樣使用常量)。鏈接列表非常容易增長和縮小,並且不會永遠限制爲MAX_QUEUE_SIZE和CAR_PARK_SIZE大小的數組。 – Shizzmo 2009-09-09 11:59:42

回答

3

問題是在這裏:

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

你服用指針在堆棧對象,因此它被刪除/覆蓋每一次,所以指針可以是相同的。

Car *c; 
c = new_car(); 

and new_car should return pointer。

編輯:

new_car應的malloc()的新車,(你需要從隊列中刪除時某處釋放()它,例如)。

考慮使用汽車數組(而不是汽車上的指針數組),並複製整個項目。

+0

這是否意味着new_car()方法將不得不malloc它來阻止它在堆棧中?另外,如果單獨的線程在將其放入停車場之前將正確的信息從隊列中拉出(同時新車仍在創建並添加到第一個線程中的隊列中),那麼在某個時刻仍然會分開指針。即使其中一個被剔除,它也是一個空引用,它不會神奇地指向另一個對象......對吧? – 2009-09-09 11:29:29

0

該示例中的Car是否在堆棧中分配?

線程間共享的對象應該使用malloc分配到堆上。