This shows you the differences between two versions of the page.
courses:programming:topic11 [2018/02/02 09:20] pro100kot |
courses:programming:topic11 [2022/12/10 09:08] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | === Динамические структуры === | ||
- | |||
- | <code c++> | ||
- | // Programming 1. Sample at 2016-11-17-14-00.56 | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | struct Person { | ||
- | char name[100]; | ||
- | int age; | ||
- | struct Person *next; | ||
- | }; | ||
- | |||
- | struct Person *data = NULL; | ||
- | |||
- | void generate_data() | ||
- | { | ||
- | data = (struct Person*)malloc(sizeof(struct Person)); | ||
- | struct Person *ptr = data; | ||
- | printf("data = %p\n",data); | ||
- | for(int i=0; i<5; i++) | ||
- | { | ||
- | sprintf(ptr->name,"name-%d",i); | ||
- | ptr->age = 10+i; | ||
- | if( 4 != i ) | ||
- | { | ||
- | ptr->next = (struct Person*)malloc(sizeof(*ptr)); | ||
- | ptr = ptr->next; | ||
- | } else ptr->next = NULL; | ||
- | } | ||
- | } | ||
- | |||
- | void print_data() { | ||
- | struct Person *ptr = data; | ||
- | while(ptr) | ||
- | { | ||
- | printf(" %s, age %d\n",ptr->name, ptr->age); | ||
- | ptr=ptr->next; | ||
- | } | ||
- | } | ||
- | |||
- | int main(/*int c, char **v */) | ||
- | { | ||
- | generate_data(); | ||
- | print_data(); | ||
- | return 0; | ||
- | } | ||
- | |||
- | </code> | ||
- | |||
- | === Вопросы по коду === | ||
- | |||
- | == Вопрос: Я не понимаю строку == | ||
- | |||
- | <code> data = (struct Person*)malloc (sizeof(struct Person)); </code> | ||
- | |||
- | Что хранит переменная data? | ||
- | |||
- | == Ответ == | ||
- | |||
- | Перменная data объявлена и инициализирована так: | ||
- | |||
- | <code>struct Person *data = NULL;</code> | ||
- | |||
- | Это указатель, который может ссылаться (но не ссылается в начальный момент, так как ему присвоено занчение NULL) на структуры типа struct Person. | ||
- | |||
- | Вызов | ||
- | |||
- | <code>malloc (sizeof(struct Person))</code> | ||
- | выделяет память размером со структуру struct Person и после приведения типа <code>(struct Person*)</code> присваивает адрес этого блока памяти указателю data. | ||
- | |||
- | После всего этого data указывает на область данных в памяти, размером с struct Person, выделенную с помощью malloc | ||