我已经实现了一个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的任何赋值也会反映在指针中。
任何人都可以告诉我可能出错的地方。由于代码很大,我无法共享整个代码段。
答案 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->msisdn
,init->language
,init->ussd_string
后,为什么要将它们设置为NULL
,这也只是通过引用struct
的内部变量来实现的。 1}}像这样:msisdn = language = ussd_string = NULL
。
即使你纠正了所有这些错误,我的回答也没问题,因为你不能通过这样的调用来修改pointer
的值:res = hashget(key, pointer);
,使用它你只能修改{{1}即*pointer
指向的值。