C 将指针作为参数传递时的非理想结果

C 将指针作为参数传递时的非理想结果,c,pointers,C,Pointers,我已经实现了一个hashmap。 结构hashmap\u elmnts {char*键; 使用int; void*data;//包含下面定义的struct ussd的malloc地址 }; struct hashmap_map { int table_sizel; int size; struct hashmap_elmnts *element ;

我已经实现了一个hashmap。 结构hashmap\u elmnts {char*键;
使用int; 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时

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

然而,在获取信息的同时,我面临一些问题:

在文件GET.c中

我调用一个函数

           USSD *pointer = NULL;     
          res =   hashget(key, pointer);
             if (pointer == NULL)
                 printf ("pointer fail\n");
              else
                 printf ("pointer pass\n");
在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上的任何赋值也会反映在指针中


谁能告诉我哪里出了问题。我无法分享整个代码片段,因为代码太大了。

在您的第一块代码中,您说您
如果将null赋值给指针
如果指针等于null
在您的第一块代码中,您说您
如果将null赋值给指针
如果指针等于null

if (pointer = NULL)
这是你的问题。如果您的编译器没有就此向您发出警告,请打开警告,或者找一个更好的编译器。您想要的是第二个
if
块中的内容:

if (pointer == NULL)
它不使用
=
的原因是您正在if语句中为
指针
赋值
NULL
。该表达式的结果是
NULL
,因此
if
块不执行,而
else
块执行

或者,有些人发现完全忽略与
NULL
的比较更容易阅读:

if (pointer)
{
    // pointer is not NULL
}
else
{
    // pointer is NULL
}
这是你的问题。如果您的编译器没有就此向您发出警告,请打开警告,或者找一个更好的编译器。您想要的是第二个
if
块中的内容:

if (pointer == NULL)
它不使用
=
的原因是您正在if语句中为
指针
赋值
NULL
。该表达式的结果是
NULL
,因此
if
块不执行,而
else
块执行

或者,有些人发现完全忽略与
NULL
的比较更容易阅读:

if (pointer)
{
    // pointer is not NULL
}
else
{
    // pointer is NULL
}
使用此方式(在相应位置进行以下更改)


int-hashget(int-key,USSD\u-STRUCT*arg)

...
*arg = data;
if (*arg == NULL)
   printf("fail\n");
else
   printf ("pass\n"):
return 1;
}
...
原因:
在您的程序中,您将
指针
作为传递值传递,在我的方法中,我将作为传递指针传递,或者基本上传递
指针
的地址,因为它的值需要在调用函数时修改

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

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

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

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

即使您纠正了所有这些错误,我的答案也没问题,因为您不能通过这样的调用来修改
指针的值:
res=hashget(key,pointer)
,使用此选项,您只能修改
*指针
,即
指针所指向的值

使用此方式(在相应位置进行以下更改)


int-hashget(int-key,USSD\u-STRUCT*arg)

...
*arg = data;
if (*arg == NULL)
   printf("fail\n");
else
   printf ("pass\n"):
return 1;
}
...
原因:
在您的程序中,您将
指针
作为传递值传递,在我的方法中,我将作为传递指针传递,或者基本上传递
指针
的地址,因为它的值需要在调用函数时修改

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

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

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

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


即使您纠正了所有这些错误,我的答案也没问题,因为您不能通过这样的调用来修改
指针的值:
res=hashget(key,pointer)
,使用此选项只能修改
*指针
,即
指针所指向的值

对不起,这是一个输入错误。我已更正了我的上述陈述。。它的if(pointer==NULL)对不起,这是一个输入错误。我已更正了我的上述陈述。。它的if(pointer==NULL)对不起,这是一个输入错误。我已更正了我的上述陈述。。它的if(pointer==NULL)对不起,这是一个输入错误。我已更正了我的上述陈述。。它的if(pointer==NULL)可能有助于显示一段独立的、可编译的代码,而不是随机的代码片段?你不能复制粘贴吗?如果无法发布整个程序,则隔离问题。准备一个最简单的完整示例,如果bug没有跳出来,就发布它。也许它会有助于显示一段独立的、可编译的代码,而不是随机的代码片段。输入错误?你不能复制粘贴吗?如果无法发布整个程序,则隔离问题。准备一个最简单完整的例子,如果bug没有向你袭来