将指针作为参数传递时的不正确结果

时间:2013-11-20 05:33:12

标签: c pointers

我已经实现了一个hashmap。              struct hashmap_elmnts                   {char * key;
                    int in_use;                     无效*数据; //包含下面定义的struct ussd的malloc的地址                    };

         struct hashmap_map
             {
               int table_sizel;
               int size;
               struct hashmap_elmnts *element ;
             };

现在,我有另一个结构USSD

         typedef struct ussd { char menu;
                         int8_t did;
                         int8_t invokeid;
                         char *language;
                         char *msisdn;
                         char *ussd_string;
                        } USSD;

现在,在插入HASHMAP时,

USSD *init = (USSD*)malloc(sizeof(USSD));
init->msisdn = (char*)malloc(sizeof(char));
init->language = (char*)malloc(sizeof(char));
init->ussd_string = (char*)malloc(sizeof(char));
msisdn = language = ussd_string = NULL;

然后,我分配一些值然后插入hashmap

然而,在收回信息时,我遇到了一些问题:

IN FILE GET.c

我调用一个函数

           USSD *pointer = NULL;     
          res =   hashget(key, pointer);
             if (pointer == NULL)
                 printf ("pointer fail\n");
              else
                 printf ("pointer pass\n");

IN FILE HASHGET.c

    int hashget(int key, USSD_STRUCT *arg)
       {
    /** declaring a hashmap_map pointer  **/
     struct hashmap_map *m;

现在,经过各种计算 - >我发现' curr'

           arg = (m->element[curr].data);

           if (arg == NULL)
               printf("fail\n");
            else
               printf ("pass\n"):
             return 1;
        }

输出如下: 通过 指针失败

当arg!= NULL但指针仍为NULL时,这怎么可能。正如我所料,arg的任何赋值也会反映在指针中。

任何人都可以告诉我可能出错的地方。由于代码很大,我无法共享整个代码段。

3 个答案:

答案 0 :(得分:3)

在第一段代码中,您说的是if assign null to pointer而不是if pointer equals null

答案 1 :(得分:2)

if (pointer = NULL)

这是你的问题。如果您的编译器没有向您发出警告,请关闭警告或找到更好的编译器。您想要的是您在第二个if区块中拥有的内容:

if (pointer == NULL)

不使用=的原因是因为您要在 if语句中将NULL分配给pointer 。该表达式的结果是NULL,因此if块不会执行,但else块会执行。

或者,有些人通过省略与NULL的比较来发现阅读更容易:

if (pointer)
{
    // pointer is not NULL
}
else
{
    // pointer is NULL
}

答案 2 :(得分:1)

使用这种方式(在各个地方进行以下更改)

...
res = hashget(key, &pointer);  
if (pointer == NULL)
   printf ("pointer fail\n");
else
   printf ("pointer pass\n");
...

...
int hashget(int key, USSD_STRUCT *arg)
...

...
*arg = data;
if (*arg == NULL)
   printf("fail\n");
else
   printf ("pass\n"):
return 1;
}
...

<强>原因:
在你的程序中,你传递pointer作为值传递,在我的方法中,我作为传递指针传递或基本上传递pointer的地址,因为它的值需要在调用函数中修改。

编辑:(在您对问题进行修改后)

USSD init = (USSD)malloc(sizeof(USSD));

这是错误的。 init应该是一个指针 使用USSD *init = (USSD*)malloc(sizeof(USSD));

在您将内存分配给init->msisdninit->languageinit->ussd_string后,为什么要将它们设置为NULL,这也只是通过引用struct的内部变量来实现的。 1}}像这样:msisdn = language = ussd_string = NULL

即使你纠正了所有这些错误,我的回答也没问题,因为你不能通过这样的调用来修改pointer的值:res = hashget(key, pointer);,使用它你只能修改{{1}即*pointer指向的值。