2010-04-03 145 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等的使用似乎表明此代码最初旨在实际使用指针进行此分配,但可能已被修改。我认为修改是“完整的”,我会继续创建一个适当的初始化和方法名称。