Структуры на С#2
От: Аноним  
Дата: 12.09.10 22:04
Оценка:
Не понимаю как ведут себя структуры.

header.h
typedef struct {

int    a;
char * b;
char * c;
} tree_node;

code.c
void do_sth(tree_node *tree_node_1)

{

    int k;
    tree_node  *tree_node_2;
    for (k = 0; k <= 255; ++k)
    {
        tree_node_1 = tree_node_2 + k;
    ...
    }
...
}


Что означает этот код, когда мы прибавляем integer к структуре? Если учесть что tree_node это не массив структур.
Re: Структуры на С#2
От: jazzer Россия Skype: enerjazzer
Дата: 13.09.10 01:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не понимаю как ведут себя структуры.


А>
А>    tree_node  *tree_node_2;
А>        tree_node_1 = tree_node_2 + k;

А>


А>Что означает этот код, когда мы прибавляем integer к структуре? Если учесть что tree_node это не массив структур.

Видишь звездочку? Это значит, что tree_node_2 — это не структура, а указатель (адрес).
Так что ты прибавляешь integer не к структуре, а к адресу, т.е. просто получаешь адрес, увеличенный на k размеров структуры.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Структуры на С#2
От: CaptainFlint http://flint-inc.ru/
Дата: 13.09.10 08:30
Оценка: +6 :))
Блин, полминуты тупил, пытаясь понять, почему этот код — си-шарп…
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[2]: Структуры на С#2
От: jhdffhg85hdgg5r  
Дата: 13.09.10 10:45
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Аноним, Вы писали:


А>>Не понимаю как ведут себя структуры.


А>>
А>>    tree_node  *tree_node_2;
А>>        tree_node_1 = tree_node_2 + k;

А>>


А>>Что означает этот код, когда мы прибавляем integer к структуре? Если учесть что tree_node это не массив структур.

J>Видишь звездочку? Это значит, что tree_node_2 — это не структура, а указатель (адрес).
J>Так что ты прибавляешь integer не к структуре, а к адресу, т.е. просто получаешь адрес, увеличенный на k размеров структуры.

вот этого я и не понял
структуры в памяти не последовательны т.к. это не массив структур. и перед этим выделялись пo malloc(). кроме того я увеличиваю на число, а не на sizeof(tree_node*)
Re: Структуры на С#2
От: LaptevVV Россия  
Дата: 13.09.10 10:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не понимаю как ведут себя структуры.


А>
А>header.h
А>typedef struct {

А>int    a;
А>char * b;
А>char * c;
А>} tree_node;

А>code.c
А>void do_sth(tree_node *tree_node_1)

А>{

А>    int k;
А>    tree_node  *tree_node_2;
А>    for (k = 0; k <= 255; ++k)
А>    {
А>        tree_node_1 = tree_node_2 + k;
А>    ...
А>    }
А>...
А>}
А>


А>Что означает этот код, когда мы прибавляем integer к структуре? Если учесть что tree_node это не массив структур.

Это не к структуре прибавляется, а к указателю. Видимо предполагается, что в функцию попадает указатель на массив структур.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Структуры на С#2
От: CaptainFlint http://flint-inc.ru/
Дата: 13.09.10 11:00
Оценка:
Здравствуйте, jhdffhg85hdgg5r, Вы писали:

J>>Так что ты прибавляешь integer не к структуре, а к адресу, т.е. просто получаешь адрес, увеличенный на k размеров структуры.


J>вот этого я и не понял

J>структуры в памяти не последовательны т.к. это не массив структур. и перед этим выделялись пo malloc(). кроме того я увеличиваю на число, а не на sizeof(tree_node*)

А что и когда выделялось — это уже другой вопрос. Если не было выделено место, просто получится указатель на невыделенную область памяти. Тут уж программист должен следить за этим (собственно, отсюда и всевозможные проблемы переполнения буфера).
Инкремент указателя на число увеличивает его именно на указанное количество размеров структур, а не байтов. Если требуется сдвинуть именно на несколько байтов, нужно сначала привести указатель к типу void*.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[4]: Структуры на С#2
От: Мишень-сан  
Дата: 13.09.10 11:45
Оценка: 4 (1) +1
Здравствуйте, CaptainFlint, Вы писали:

CF>Здравствуйте, jhdffhg85hdgg5r, Вы писали:


J>>>Так что ты прибавляешь integer не к структуре, а к адресу, т.е. просто получаешь адрес, увеличенный на k размеров структуры.


J>>вот этого я и не понял

J>>структуры в памяти не последовательны т.к. это не массив структур. и перед этим выделялись пo malloc(). кроме того я увеличиваю на число, а не на sizeof(tree_node*)

CF>А что и когда выделялось — это уже другой вопрос. Если не было выделено место, просто получится указатель на невыделенную область памяти. Тут уж программист должен следить за этим (собственно, отсюда и всевозможные проблемы переполнения буфера).

CF>Инкремент указателя на число увеличивает его именно на указанное количество размеров структур, а не байтов. Если требуется сдвинуть именно на несколько байтов, нужно сначала привести указатель к типу void*.

Выделенное, к сожалению, неверно. Арифметика указателей с типом void* запрещена. Надо приводить к char*, который по стандарту размером в 1 байт.
Re[5]: Структуры на С#2
От: CaptainFlint http://flint-inc.ru/
Дата: 13.09.10 12:21
Оценка:
Здравствуйте, Мишень-сан, Вы писали:

МС>Выделенное, к сожалению, неверно. Арифметика указателей с типом void* запрещена. Надо приводить к char*, который по стандарту размером в 1 байт.


Странно, gcc 4.5.0 нормально компилит (хотя даёт ворнинг). Ладно, на будущее буду иметь в виду (хотя вряд ли мне понадобится сдвигать указатель побайтово ). Спасибо за поправку.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[2]: Структуры на С#2
От: jhdffhg85hdgg5r  
Дата: 13.09.10 13:02
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, Аноним, Вы писали:


А>>Не понимаю как ведут себя структуры.


А>>
А>>header.h
А>>typedef struct {

А>>int    a;
А>>char * b;
А>>char * c;
А>>} tree_node;

А>>code.c
А>>void do_sth(tree_node *tree_node_1)

А>>{

А>>    int k;
А>>    tree_node  *tree_node_2;
А>>    for (k = 0; k <= 255; ++k)
А>>    {
А>>        tree_node_1 = tree_node_2 + k;
А>>    ...
А>>    }
А>>...
А>>}
А>>


А>>Что означает этот код, когда мы прибавляем integer к структуре? Если учесть что tree_node это не массив структур.

LVV>Это не к структуре прибавляется, а к указателю. Видимо предполагается, что в функцию попадает указатель на массив структур.

небрежно просмотрел код, там действительно оказался массив указателей на структуры, спрятанный в макросах. всем спасибо за участие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.