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

我已经实现了一个hashmap。 struct hashmap_elmnts {char * key;
int in_use; void * data; //包含下面定义的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时,INITIALISATION:
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;

然后,我分配一些值,然后插入散列表

但是,在获取信息的同时,我遇到了一些问题:

在文件GET.c中

我称之为功能

           USSD *pointer = NULL;     
          res =   hashget(key, pointer);
             if (pointer == NULL)
                 printf ("pointer failn");
              else
                 printf ("pointer passn");

在文件HASHGET.c

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

现在,经过各种计算 - >我找到'curr'的值

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

           if (arg == NULL)
               printf("failn");
            else
               printf ("passn"):
             return 1;
        }

输出如下:传递指针失败

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

任何人都可以让我发现可能出错的东西。 由于代码非常庞大,我无法共享整个代码片段。


在你的第一个代码块中,你是在说if pointer equals null if assign null to pointer那么if assign null to pointer if pointer equals null


if (pointer = NULL)

这是你的问题。 如果你的编译器没有警告你这个问题,那么可以把你的警告提出来,或者找一个更好的编译器。 你想要的是什么,你有你的第二个if块:

if (pointer == NULL)

它不与其中一个=工作的原因是因为你正在给if语句中的pointer分配NULL 。 该表达式的结果是NULL ,因此if块不会执行,但else块会执行​​。

或者,有些人通过完全忽略与NULL的比较可以更容易阅读:

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

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

...
res = hashget(key, &pointer);  
if (pointer == NULL)
   printf ("pointer failn");
else
   printf ("pointer passn");
...

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

...
*arg = data;
if (*arg == NULL)
   printf("failn");
else
   printf ("passn"):
return 1;
}
...

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

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

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

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

当你将内存分配给init->msisdninit->languageinit->ussd_string ,你为什么要将它们设置为NULL ,也就是通过像这样引用struct的内部变量: msisdn = language = ussd_string = NULL

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

链接地址: http://www.djcxy.com/p/85953.html

上一篇: Unsual Result when passing pointer as argument

下一篇: Undefined struct timeval declaration in C