C结构指针问题

时间:2010-04-03 14:17:54

标签: c pointers struct

我有这个结构;

#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前放一个&时,它会平静下来,但我不确定它是否会起作用。我上面写的不是真的吗?

3 个答案:

答案 0 :(得分:3)

NULL是“空指针”,但data_buffer_allocationint的数组。你应该比较0:

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

答案 1 :(得分:3)

可能是因为NULL#define'd为(void*)0,这意味着

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

将int与指针进行比较。将其更改为与0比较。

答案 2 :(得分:0)

由于您没有指针数组,因此与NULL的比较不合适(尽管它们最终会解析为0)。

要使比较有效,您需要将目录与零进行比较。但是,请记住,获取数组不会初始化值,因此您的数组中将有随机垃圾开始。因此,与零相比(除非您在其他地方将值初始化为零)将是不一致且无用的。

此外,它可能是挑剔的,但当我听到类似allocate_data_buffer的方法/功能时,我会考虑资源获取,例如需要newnew[]。您的方法名称和NULL等的使用似乎表明此代码最初旨在实际使用指针进行此分配,但可能已被修改。为了使修改在我看来是“完整的”,我将继续创建一个正确的初始化和方法名称。