2016-09-19 6 views
0

Я программирование на 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

Вы знаете что-то о локальном scoped var ..... – LPs

+0

Независимо от того, что переменная 'a' является локальной функцией getData(), поэтому вы не должны ее возвращать (или указатель на нее или худший указатель на указатель, который также является локальной переменной). – hexasoft

ответ

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

Вы используете локальную переменную, время жизни этой переменной заканчивается функцией, используйте malloc, чтобы сохранить его значение.

struct MY_TYPE *p = malloc(sizeof *p); 

if (p != NULL) { 
    p->value = 123; 
    *m_type = p; /* Dereference the passed pointer to pointer */ 
} 
Смежные вопросы