将指针作为参数传递时的不确定结果
我已经实现了一个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->msisdn
, init->language
, init->ussd_string
,你为什么要将它们设置为NULL
,也就是通过像这样引用struct
的内部变量: msisdn = language = ussd_string = NULL
。
即使你纠正了所有这些错误,我的回答也没问题,因为你不能通过像这样的调用来修改pointer
的值: res = hashget(key, pointer);
,使用这种只能修改*pointer
即价值被指向的pointer
。