Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
PolAR
Зарегистрирован: 01.11.2004 Сообщения: 133
|
Добавлено: Пн Ноя 21 2005 18:02 Заголовок сообщения: Взятие адреса в С |
|
|
Возник такой вопрос:
Язык программирования: С.
Допустим есть такая структура:
Код: | struct my_struct {
int a;
char b;
}; |
Инициализируем:
Код: | struct my_struct s,*s1;
char *bptr;
s1=(struct my_struct*)&s;
|
Вопрос: потребует ли следующее присваивание
непосредственному обращению к памяти ( т.е. той что выделена при инициализации под s)
или адрес будет вычислен как s1+OFF, где OFF-смещение b в структуре my_struct? _________________ Come Together!! Right Now.... |
|
Вернуться к началу |
|
 |
kolobok0
Зарегистрирован: 22.04.2005 Сообщения: 253 Откуда: Мсква
|
Добавлено: Вт Ноя 22 2005 15:32 Заголовок сообщения: Re: Взятие адреса в С |
|
|
PolAR писал(а): | ....Вопрос: потребует ли следующее присваивание....
непосредственному обращению к памяти ( т.е. той что выделена при инициализации под s) или адрес будет вычислен как s1+OFF, где OFF-смещение b в структуре my_struct? |
А будь Вы микропроцессором - Вы бы обратились бы ? И осадок нафига ? Про запас ничего не делаеться... Если НЕТ ЯВНОГО обращения по указанному адресу - значит его НЕТ.
Другое дело, что это смотриться коряво и возникает резонный вопрос - нахрена такой гимор ? Возможно есть более элегантные пути решения ?
В Вашем примере переменная bptr будет вычисляться (скорее всего) в регистре микропроцессора. Туда будет помещён адресс указывающий на память (s1) и добавлено смещение, вычисленное на линковке. В зависимости от типа проца эти действия могут выглядеть по разному.
По поводу корявости...Дело в том, что если Вы повнимательней вглядитесь в рекомендации Корнегиан и Ричи (не ошибся в фамилиях ?), то увидите в профиль то, что легло в основу C++. Один из постулатов - инкапсуляция данных и кода. Другими словами брать адрес на потроха структуры - значит предпологать, что время жизни данной структуры будет БОЛЬШЕ чем сам УКАЗАТЕЛЬ. Надеяться, что это выполниться АВТОМАТИЧЕСКИ(или подразумевается) у Вас в коде - вверх легкомыслия... Но в некоторых случаях это может и имеет под собой основу...хотя на мой взгляд я таких примеров НЕ встречал...
с уважением
(круглый) |
|
Вернуться к началу |
|
 |
PolAR
Зарегистрирован: 01.11.2004 Сообщения: 133
|
Добавлено: Вт Ноя 22 2005 19:46 Заголовок сообщения: |
|
|
Спасибо. Я так и думал!
По поводу сказанного kolobok0:
Цитата: | Другими словами брать адрес на потроха структуры - значит предпологать, что время жизни данной структуры будет БОЛЬШЕ чем сам УКАЗАТЕЛЬ |
В моем случае это точно - указатель используется для чтения I/O memory в драйвере.
Сложность была в том, что к I/O нежелательно обращение напрямую, а лучше через спец функции, в которые этот самый указатель и передается
У меня было 2 варианта:
1. Определить константы со смещениями для каждого поля I/O окна тогда адрес поля вычисл: s+FIELD_OFFS
2. Представить это окно в виде структуры ( что мне кажется проще ) и передавать так &(s->field)
Если есть еще какие-нибудь Цитата: | более элегантные пути решения | буду очень благодарен. _________________ Come Together!! Right Now.... |
|
Вернуться к началу |
|
 |
|