2010-04-03 169 views
0

我有這個結構;C結構指針問題

#define BUFSIZE 10 
struct shared_data { 
    pthread_mutex_t th_mutex_queue; 
    int count; 

    int data_buffer_allocation[BUFSIZE]; 
    int data_buffers[BUFSIZE][100]; 
}; 

我想爲進程分配一個data_buffers,爲此我執行下面的函數;

int allocate_data_buffer(int pid) { 
    int i; 
    for (i = 0; i < BUFSIZE; i++) { 
     if (sdata_ptr->data_buffer_allocation[i] == NULL) { 
      sdata_ptr->data_buffer_allocation[i] = pid; 
      return i; 
     } 
    } 
    return -1; 
} 

但編譯器警告我,我正在比較指向值的指針。當我在sdata_ptr前面放置一個&時,它平靜下來,但我不確定它是否會起作用。是不是我上面寫的應該是真的?

+0

爲了達到預期效果(在NULL修復之後),請記住,您需要初始化這些值。 – KevenK 2010-04-03 14:31:17

回答

3

大概是因爲NULL是#define'd是(void*)0這意味着

if (sdata_ptr->data_buffer_allocation[i] == NULL) { 

將一個int比較指針。改爲將其比較爲0。

+0

哦,對,多麼愚蠢:D謝謝 – Halo 2010-04-03 14:23:26

3

NULL是「空指針」,但data_buffer_allocationint的數組。你應該比較0:

if (sdata_ptr->data_buffer_allocation[i] == 0) { 
0

由於您沒有指針數組,因此與NULL的比較是不正確的(儘管它們最終將解析爲0)。

爲使比較有效,您需要將目錄與零比較。但是,請記住,獲取數組不會初始化值,因此您將在數組中隨機垃圾開始。因此,與零相比(除非您將您的值初始化爲其他地方的零)將會不一致且毫無用處。

此外,它可能是挑剔的,但是當我聽到類似allocate_data_buffer的方法/功能時,我想到資源獲取,例如需要newnew[]。您的方法名稱以及NULL等的使用似乎表明此代碼最初旨在實際使用指針進行此分配,但可能已被修改。我認爲修改是「完整的」,我會繼續創建一個適當的初始化和方法名稱。