我在C编程。
我有一个结构:
struct MY_TYPE {
boolean flag;
short int value;
double stuff;
};
我有一个函数,它将指向MY_TYPE
的指针作为参数:
getData(struct MY_TYPE ** m_type) {
// I initialise an object of MY_TYPE
struct MY_TYPE a = {.value = 123};
// I assign the address of above object to a pointer of MY_TYPE
struct MY_TYPE *p = &a;
// I assign the address of above pointer to parameter
m_type = &p;
}
在我的主程序中,我调用了上面的函数:
struct MY_TYPE *my_param;
getData(&my_param);
// I set a break pointer here, and it shows me my_param is NULL, why?
在调用getData(...)之后,传入的参数为NULL,为什么?
答案 0 :(得分:2)
这是一种未定义的行为,由于您正在分配通过值传递的指针,因此不会发生这种行为。
m_type
内getData
所做的任何更改。您需要指定*m_type
才能使更改产生任何差异。struct a
一旦getData
返回就会超出范围。您可以通过返回在函数内初始化的动态分配块来解决此问题:
getData(struct MY_TYPE ** m_type) {
// I initialize an object of MY_TYPE
struct MY_TYPE a = {.value = 123};
// I make a copy into dynamic memory
struct MY_TYPE *copy = malloc(sizeof(struct MY_TYPE));
memcpy(copy, &a);
// I assign the address of above pointer to parameter
*m_type = copy;
}
来电者需要释放通话中收到的内存:
struct MY_TYPE *my_param;
getData(&my_param);
... // Use my_param here.
// Now that I am done with my_param...
free(my_param);
答案 1 :(得分:1)
您正在使用局部变量,此变量的生命周期以函数结束,使用malloc
以保留其值。
struct MY_TYPE *p = malloc(sizeof *p);
if (p != NULL) {
p->value = 123;
*m_type = p; /* Dereference the passed pointer to pointer */
}