Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> адрес указателя типа char, странный какой-то адрес... 
:(
    Опции темы
GIK
Дата 20.12.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Собственно вопрос, и все будет видно если откомпилить код ниже.
Код

#include<iostream>
using namespace std;

int main(int argc, char* argv[])
{
 char ch1='a', ch2='b', ch3='c', ch4='d', ch5='e';
 char *chr;
 chr=&ch1;
 cout<<chr<<endl;
 chr=&ch2;
 cout<<chr<<endl;
 chr=&ch3;
 cout<<chr<<endl;
 chr=&ch4;
 cout<<chr<<endl;
 chr=&ch5;
 cout<<chr<<endl;

 int i=1, u=1233, o=21, y=21, r=21;
 int *p;

 p=&i;
 cout<<p<<endl;
 p=&u;
 cout<<p<<endl;
 p=&o;
 cout<<p<<endl;
 p=&y;
 cout<<p<<endl;
 p=&r;
 cout<<p<<endl;
 char ch;
 cin>>ch;
        return 0;
}


почему адреса указателей на char имеют такую маркировку.
Код

a% |
ba% |
cba% |
cdba% |
cdeba% |
1245052
1245048
1245044
1245040
1245036

Вобщем вместо символа % непонятный знак, а вместо | , какаято стрелка


ЗЫ. Почему отсчет памяти начинается с 1,24 мегабайт, когда оператива 512 метров. Нежели так мало выделяется?

Если что сильно не пинать, за глупый вопрос.







--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
BreakPointMAN
Дата 20.12.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Когда по правую сторону от "cout <<" находится переменная типа char*, компилятор думает, что ты хочешь вывести строку... Про ASCIIZ-строки что-нибудь слышал? (подробности в ВикипедиИ: нуль-терминированная строка и строковый тип). Вот у тебя и пашет он непаханное поле, пока на нуль-символ '\0' не наткнется... Поможет явное приведение указателя к типу void*:
Код

cout<<(void*)chr<<endl;



--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
witex
Дата 20.12.2006, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 0
Всего: 4



Цитата

Почему отсчет памяти начинается с 1,24 мегабайт, когда оператива 512 метров. Нежели так мало выделяется?

А почему бы и нет! Здесь че зависит нет ограничения..  не только твоя программа спользует оперативную программу. Операционка выделяет тебе конкретную ячейку памяти! которая в данный момент свободна.. ну и ессесно ближе к началу. 
З.Ы. вроде так, если я не ошибаюсь.. поправте если что!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
GIK
Дата 21.12.2006, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Цитата(BreakPointMAN)

Когда по правую сторону от "cout <<" находится переменная типа char*, компилятор думает, что ты хочешь вывести строку... 

Понятно.

Цитата(witex)

А почему бы и нет! Здесь че зависит нет ограничения..  не только твоя программа спользует оперативную программу. Операционка выделяет тебе конкретную ячейку памяти! которая в данный момент свободна.. ну и ессесно ближе к началу. 

А что, если приложению нужно будет больше памяти? Можно распределение как-то регулировать с помошью средств C++? Или это в булдере делается?


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Anikmar
Дата 21.12.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Для большинства задач памяти будет более чем достаточно - счет идет на гигабайты, так что не переживайте.
PM MAIL ICQ   Вверх
W4FhLF
Дата 21.12.2006, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата

Почему отсчет памяти начинается с 1,24 мегабайт, когда оператива 512 метров. Нежели так мало выделяется?


Это виртуальные адреса, а не физические, поэтому ни о каких 1.24 мегабайтах речь идти не может. Реальное физическое смещение участка памяти в оперативной памяти может быть и на 300 метрах, при это в программе оно может указывать на "1.24 метра". 

Цитата

А что, если приложению нужно будет больше памяти? Можно распределение как-то регулировать с помошью средств C++? Или это в булдере делается?


Распределение регулируется системой, при этом ты можешь это контролировать на уровне API функций. Выделение может идти как из кучи(HeapAlloc) и созданием нового участка в оперативной памяти(VirtualAlloc), и выделением памяти в свопе(MMF).





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GIK
Дата 21.12.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Цитата(W4FhLF)

при этом ты можешь это контролировать на уровне API функций.


Цитата(W4FhLF)

и выделением памяти в свопе(MMF).


Подробнее эти два момента можно обсудить?





--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
W4FhLF
Дата 21.12.2006, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Ну а что тут обсуждать?

Ключевые слова: Memory Mapped File
CreateFileMapping, MapViewOfFile, OpenFileMapping

Небольшая цитата из туторов ICZELION'a:

Цитата

Было бы неплохо, если бы мы могли зарезервировать очень большой блок памяти, достаточный для того, чтобы сохранить весь файл, но наша программа стала бы очень прожорливой в плане ресурсов. File maрing - это спасение. Используя его, вы можете считать весь файл уже загруженным в память и использовать указатель на память, чтобы читать или писать данные в файл. Очень просто. Hет нужды использовать API памяти и файловые API одновременно, в FM это одно и то же. FM также используется для обмена данными между процессами. При использовании FM таким образом, реально не используется никакой файл. Это больше похоже на блок памяти, который могут видеть все процессы. Hо обмен данными между процессами - весьма деликатный предмет. Вы должны будете обеспечить синхронизацию между процессами и ветвями, иначе ваше приложение очень скоро повиснет. 







--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
MAKCim
Дата 21.12.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Почему отсчет памяти начинается с 1,24 мегабайт, когда оператива 512 метров

При трансляции кода на ассемблере (который был получен компилятором в процессе кодогенерации)
выбирается некоторая база для каждой из секций (данных, кода, стека) и относительно этой базы ведется дальнейшая работа. Например для кода это может быть 0x00000000, для данных 0x08000000 и т. д. Каждая команда в секции кода (или участок памяти в секции данных) имеет смещение относительно бызы, следующая команда - относительное смещение предыдущей команды + ее размер (аналогично для данных) и т. д. При загрузке программы операционной системой в большинстве случаев для процесса, в котором работает программа, создается таблица преобразования виртульных адресов (диапозоны значений этих виртуальных адресов обычно прописываются в заголовках исполняемых файлов) в физические (обычно такой трансляцией занимается аппаратное MMU). У каждого процесса - своя таблица преобразования и свое физическое адресное пространство. Виртуальные же пространства адресов различных процессов могут перекрываться или вообще быть одинаковыми. При попытке обратится по произвольному адресу, например
Код

*(int*)0xFFFF0F0F = 0755;

в большинстве случаев сгенерируется аппаратное исключение типа PF (Page Fault) (говорю об архитектуре IA-32)
из-за того, что доступ к странице, которой соответствует данный адрес после преобразования, запрещен или из-за того, что отображение вовсе отсутствует


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
W4FhLF
Дата 21.12.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата

в большинстве случаев сгенерируется аппаратное исключение типа PF (Page Fault) (говорю об архитектуре IA-32)
из-за того, что доступ к странице, которой соответствует данный адрес после преобразования, запрещен или из-за того, что отображение вовсе отсутствует


Аппаратное исключение может возникнуть только в случае обращения к этим адресам из драйера, в случае обращения к адресам выше 0x7FFFFFFF из программы режима пользователя(о чём сейчас и идёт речь) возникает системное прерывание, ибо данные и код находящиеся по адресу выше приведённого доступны только на уровне ядра.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GIK
Дата 21.12.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



Про память понятно, узнал много нового.

Цитата

Ключевые слова: Memory Mapped File
CreateFileMapping, MapViewOfFile, OpenFileMapping

Мне бы примерчик с этими функциями.


--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
MAKCim
Дата 21.12.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Аппаратное исключение может возникнуть только в случае обращения к этим адресам из драйера, в случае обращения к адресам выше 0x7FFFFFFF из программы режима пользователя(о чём сейчас и идёт речь) возникает системное прерывание, ибо данные и код находящиеся по адресу выше приведённого доступны только на уровне ядра.

что за константа? по типу __PAGE_OFFSET только в винде? что за системное прерывание?
про исключения:
Код

mov EAX, FFFF0F0Fh
mov [EAX], 50

это вызовет именно аппаратное исключение и передачу управления на соответствующий обработчик, который уже реализуется ОС


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
BreakPointMAN
Дата 22.12.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Цитата(GIK @ 21.12.2006,  21:30)
Про память понятно, узнал много нового.

Цитата

Ключевые слова: Memory Mapped File
CreateFileMapping, MapViewOfFile, OpenFileMapping

Мне бы примерчик с этими функциями.

MSDN, Рихтер...


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
W4FhLF
Дата 22.12.2006, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Цитата(MAKCim @  21.12.2006,  21:17 Найти цитируемый пост)
что за константа? по типу __PAGE_OFFSET только в винде? что за системное прерывание?про исключения:

Код

mov EAX, 
FFFF0F0Fhmov [EAX], 50


это вызовет именно аппаратное исключение и передачу управления на соответствующий обработчик, который уже реализуется ОС


Всё дело в том, что в NT системах идёт чёткое разделение памяти на: адресное пространство пользовательского уровня(от 0x00010000 до 0x7FFFFFFF), это пространство для каждого процесса своё и системное адресное пространство(от 0x800000000 до 0xFFFFFFFF), это пространство для всей системы и всех процессов одно, в нём находятся все драйвера, ядро системы, кеш и все управляющие структуры. 
Причём код, которые находится в пользовательском пространстве выполняется на 3 кольце привелегий, а код находящий в систмемном адресном пространстве выполняется на нулевом кольце привелегий. Отсюда следует, что если из 3 кольца ты попытаешься обратиться к адресу выше 0x7FFFFFFF, то возникнет исключение, но не аппаратное, а системное, т.е. система просто не даст обратиться к этому адресу, независимо есть ли эта страница в памяти или её нет. Другое дело, если ты обратишься к тому же участку памяти и нулевого кольца, тут уже будет всё зависеть от наличия данной страницы в памяти или её аттрибутов, и если произошло исключение, и на него небыл поставлен обработчик, то можно откинуться на спинку кресла и подождать пока система перезагрузитьсяsmile 

Это сообщение отредактировал(а) W4FhLF - 22.12.2006, 10:16


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Lycifer
Дата 4.11.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 144
Регистрация: 4.11.2007

Репутация: нет
Всего: нет



BreakPointMAN - компилятор не думает, он компилирует (смотрить реализацию STL)

witex - Попровляю, операционка пулет память, и выделение память происход на свободную память твоего процесса(Windows 32 bit это 2 гига наверное уже мало, но это вопрос другой)

GIK - если память не хватает то операционка лезит на жёсткий диск - это учень медленно работает в Linux видел что производительность обращения памяти падает в 30 раз, и на это много причин

W4FhLF- API это косвенное имеет этношения к С++, здесь речь идёт к прямому отношения к С++, а вообще ты  прав, но только для новичка может это не много сложновато, хотя...


GIK - указатель(лубой стековый объект) помещается в память по мере раскрутки стека, стека своя адрессация которая только косвенно связано с кучей, ну вот кучей управляется ОС, а стеком закгрусчик бинарного файла

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0708 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.