C 将指针作为参数传递时的非理想结果
我已经实现了一个hashmap。 结构hashmap\u elmnts {char*键;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 ;
使用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没有向你袭来