2014-10-12 2 views
0

Например, у меня есть функция:Доступ к структурам данных, созданным внутри функции?

void build() 
{ 
    struct Node *node; 
    node = (struct Node*)malloc(sizeof(struct Node)); 
} 

Можно ли получить доступ к указатель «узел» с внешней стороны?

+0

Да, это возможно. – user1336087

+0

@geoxile Вы можете передать указатель в качестве аргумента? – 4pie0

+0

Нет, к сожалению, функция уже установлена, я просто должен ее использовать. Решение глобальной переменной vz0 является единственным вариантом. – geoxile

ответ

0

C - довольно простой и простой язык. Единственный выбор у вас есть, чтобы explicitlly поставить значение узла где-то, Eiter:

  1. глобальных переменная
  2. параметров на функции
  3. возвращаемого значение

Варианта 2 и 3 являются наиболее распространенными из них. В качестве аргумента функции:

void build(struct Node **node_param) 
{ 
    struct Node *node; 
    node = (struct Node*)malloc(sizeof(struct Node)); 
    *node_param = node; 
} 

Для варианта 3 может быть просто:

struct Node * build() 
{ 
    struct Node *node; 
    node = (struct Node*)malloc(sizeof(struct Node)); 
    return node; 
} 

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

+0

У меня есть еще один вопрос о глобальных переменных. Если у моего узла структуры есть еще одна структура поля Node * next, и я создаю глобальную переменную, называемую struct Node * root (с root-> next initialized as NULL), я смогу изменить root-> next на другое значение? – geoxile

+0

@geoxile да, вы можете получить доступ к данным узла через указатель – 4pie0

0

Возможно ли получить доступ к указателю «узел» снаружи?

Нет, не этот точный указатель, так как вы не знаете адрес памяти, возвращаемый malloc. Вы можете получить доступ к экземпляру Node, на который указывает *node, если вы возвращаете инициализированный указатель из функции или передаете его в качестве аргумента для этой функции, инициализируйте внутри функции и используйте после этого.

пример:

// pass pointer to pointer, so we will change original pointer not a copy 
void build(struct Node **nodePtr) 
{ 
    struct Node *node; 
    node = malloc(sizeof(struct Node)); 
    // ^^^^ 
    // no need to cast result of malloc in C 
    *nodePtr = node; 
    // the rest... 
}