【问题标题】:C Structure Pointer ProblemC结构指针问题
【发布时间】:2010-04-03 14:17:54
【问题描述】:

我有这个结构;

#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;
}

但是编译器警告我,我正在将指针与一个值进行比较。当我将&amp; 放在 sdata_ptr 前面时,它会平静下来,但我不确定它是否会起作用。我上面写的不应该是真的吗?

【问题讨论】:

  • 为了使其按预期工作(在NULL 修复之后),请记住您需要初始化这些值。

标签: c pointers struct


【解决方案1】:

可能是因为 NULL 被 #define 定义为 (void*)0,这意味着

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      另外,它可能很挑剔,但当我听到allocate_data_buffer 之类的方法/函数时,我会想到资源获取,例如需要newnew[]。您的方法名称和NULL 的使用似乎表明此代码最初打算实际使用指针进行此分配,但可能已被修改。在我看来,要使修改“完成”,我将继续创建正确的初始化和方法名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 2013-09-12
        相关资源
        最近更新 更多