2013-05-02 2 views
0

Я новичок в StackOverflow, так что извините, если эта тема уже обсуждалась.доступ к узлам структуры в C

Я работаю над проектом, и мне нужно использовать минимальный объем памяти, поэтому мой вопрос: возможно ли получить доступ к узлу узла структуры, имея адрес поля этой структуры , Например, у меня есть эта структура:

typedef struct SLL{ 
    char *name; 
    int *id; 
    struct SLL *next; 
    }SLL; 

где-то в моем коде я получить адрес с идентификатором ... так что можно получить адрес от всего узла, используя адрес с идентификатором?

ответ

0

Рассмотрим offsetof <stddef.h>:

typedef struct SLL{ 
    char *name; 
    int *id; 
    struct SLL *next; 
    }SLL; 

int main() 
{ 
    SLL *p=malloc(sizeof(SLL)); 
    void *id=&p->id; 
    void *test= id - offsetof(SLL, id); 
    printf("SLL=%p test=%p\n", p, test); 
    return 0; 

}  
+0

Thx! теперь я могу исключить пару своих функций, потому что не используется. – line2sun

0

Да, вы можете, потому что структура хранится смежно. Ваш вопрос относится к указатель арифметики. Адрес всего узла (значение указателя структуры) равен (SLL *) (id - sizeof (name)).

0

Как правило, адрес структуры совпадает с адресом первого элемента.

Это компилятор зависит, однако (я думаю . Не цитируйте меня на этом. Серьезно.), И вы можете иметь обивку байты добавлены в структуры по причинам, которые я не понимаю, но можно надеяться, принять к сведению, если более опытный человек должен прокомментировать это объяснение, почему: V

Лучше всего вычесть sizeof (char *) из адреса памяти (int * id).

0

ДА вы можете получить его. Как только вы предоставите память этой структуре, блок памяти получит резерв для этого. Этот блок будет иметь непрерывную память lcation для трех указателей, которые являются символами char, int и SLL. Если вы знаете указатель на второй элемент, тогда просто вычтите sizeof (char *) из этого, чтобы добраться до базового местоположения (или первого элемента) этой структуры.

Смежные вопросы