我有这个结构;
#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 :(得分:3)
NULL
是“空指针”,但data_buffer_allocation
是int
的数组。你应该比较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
的方法/功能时,我会考虑资源获取,例如需要new
或new[]
。您的方法名称和NULL
等的使用似乎表明此代码最初旨在实际使用指针进行此分配,但可能已被修改。为了使修改在我看来是“完整的”,我将继续创建一个正确的初始化和方法名称。