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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массв char*, выделение памяти 
V
    Опции темы
lv151
Дата 1.2.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  31.1.2009,  22:57 Найти цитируемый пост)
char x[5] // компилятор создает на стеке массив из 5 элементов         =  "asdq"; // и копирует в него эту строку char *x = "asdq"; // тут ничего не выделяется в рантайме 


1) char *x = "asdq" – в данном случае значением указателя является адрес переменной в сегменте данных, который получаем во время компиляции? Правильно я понял?

2) А если переменная не глобальная?

fun()
{ 
   char x1[5]  = "aaaa";
   char *x = "asdq";
}

При вызове функции "aaaa" помещается в стек, после,  строка "asdq". Значением x является вершина стека?
т.е. стек выглядит так?

значение      адрес
asdq              04
aaaa              05

х = 04?


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


любитель
****


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

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



Цитата(lv151 @  1.2.2009,  09:41 Найти цитируемый пост)
1) char *x = "asdq" – в данном случае значением указателя является адрес переменной в сегменте данных, который получаем во время компиляции? Правильно я понял?

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

Цитата(lv151 @  1.2.2009,  09:41 Найти цитируемый пост)
При вызове функции "aaaa" помещается в стек, после,  строка "asdq". 

во время компиляции эти строки ложатся в сегмент данных, 
а в рантайме указатели инициализируются адресом  этой строки, а массивы данными той строки из сегмента данных.
Цитата(lv151 @  1.2.2009,  09:41 Найти цитируемый пост)
х = 04?

стек выглядит примерно так :

нач.адреес  значение      кон.адрес                      
00                 asdq\0           04 // x1[5] = 
05                 0x....              08  // где 0х... адрес строки
5 байт на массив, и 4 на указатель (для обычных (х86) 32хбитных машин, при условии отсутствия выравнивания на стеке.. но это смысла не меняет)


Это сообщение отредактировал(а) mes - 1.2.2009, 13:19


--------------------
PM MAIL WWW   Вверх
vinter
Дата 1.2.2009, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(mes @  1.2.2009,  14:15 Найти цитируемый пост)
во время компиляции эти строки ложатся в сегмент данных,

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


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 1.2.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(vinter @  1.2.2009,  12:19 Найти цитируемый пост)
Во втором случе я вообще причн не вижу хранить строку, оставить ее в стеке и не марать сегмент данных вовсе. 

откуда она возьмется то в рантайме  ? )

Добавлено через 45 секунд
Цитата(vinter @  1.2.2009,  12:19 Найти цитируемый пост)
быть помещена в любой read only сегмент

это не принципиально и на текущий момент только запутает..



--------------------
PM MAIL WWW   Вверх
lv151
Дата 1.2.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Посоветуйте, что можно почитать по данной теме.
PM MAIL   Вверх
vinter
Дата 1.2.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(mes @  1.2.2009,  14:21 Найти цитируемый пост)
откуда она возьмется то в рантайме

а причем тут рантайм?
Цитата(lv151 @  1.2.2009,  11:41 Найти цитируемый пост)
char x1[5]  = "aaaa";

это не рантайм


--------------------
Мой блог
PM MAIL WWW   Вверх
GoldFinch
Дата 1.2.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



mes, хз как у С++ а в делфи константы кладутся в сегмент кода, сразу за телом функции в которой они используются
PM MAIL ICQ   Вверх
mes
Дата 1.2.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(vinter @  1.2.2009,  13:22 Найти цитируемый пост)
а причем тут рантайм?
Код

char x1[5]  = "aaaa";

это не рантайм 

инициализация массива x1(заполнение стека) происходит  в рантайме.

Цитата(GoldFinch @  1.2.2009,  13:30 Найти цитируемый пост)
mes, хз как у С++ а в делфи константы кладутся в сегмент кода, сразу за телом функции в которой они используются 

также, зависит от компилятора и места  где определены данные (глобально или в функции)
в нашем случае сегмент данных, и данные в сегменте кода означает одно и то же, "данные хранящиеся в теле "ехешника" " и с точки зрения языка неразличимы.




Это сообщение отредактировал(а) mes - 1.2.2009, 14:43


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


Опытный
**


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

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



Посоветуйте литературу по данной теме.

Это сообщение отредактировал(а) lv151 - 1.2.2009, 15:16
PM MAIL   Вверх
vinter
Дата 1.2.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(mes @  1.2.2009,  15:35 Найти цитируемый пост)
инициализация массива x1(заполнение стека) происходит  в рантайме.

давай не будет понятия подменять, нет там никакого рантайма. Все известно на этапе компиляции.
Цитата(mes @  1.2.2009,  15:35 Найти цитируемый пост)
с точки зрения языка неразличимы.

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

Добавлено через 1 минуту и 1 секунду
Цитата(lv151 @  1.2.2009,  16:15 Найти цитируемый пост)
Посоветуйте, что можно почитать по данной теме.

книжки по С\С++ любые, огбсуждения книжек идут в прикрепленном топике


--------------------
Мой блог
PM MAIL WWW   Вверх
lv151
Дата 1.2.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @  1.2.2009,  15:15 Найти цитируемый пост)
книжки по С\С++ любые, огбсуждения книжек идут в прикрепленном топике

Там так глубоко не копают. Просмотрел не одну, перед тем как задать вопрос.
PM MAIL   Вверх
vinter
Дата 1.2.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(lv151 @  1.2.2009,  16:24 Найти цитируемый пост)
Там так глубоко не копают. Просмотрел не одну, перед тем как задать вопрос.

потомучто это копание отношения к С++ не имеет, это уже зависит от реализации. Самая подробная книга у Страуструпа, знать глубже чем там написано, зачастую даже вредно smile


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 1.2.2009, 16:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(vinter @  1.2.2009,  14:15 Найти цитируемый пост)
давай не будет понятия подменять, нет там никакого рантайма. Все известно на этапе компиляции.

давай.. и так когда происходит создание и инициализация массива ? размер которого и содержание (точнее сказать образ) известны на этапе компиляции.

Цитата(vinter @  1.2.2009,  14:15 Найти цитируемый пост)
с точик зрения языка вообще никаких сегментов нет, так, что ты изначально не прав.

я про обязательное наличие сегментов и не утверждал, было лишь употреблено для легкого понимания

Цитата(mes @  31.1.2009,  21:57 Найти цитируемый пост)
Это её адрес в "теле exe-ника"

Цитата(mes @  31.1.2009,  21:57 Найти цитируемый пост)
грубо говоря да.


Цитата(mes @  1.2.2009,  12:21 Найти цитируемый пост)
это не принципиально и на текущий момент только запутает

не вид, ни место хранения данных, которыми заполняется массив не важен. 

Важно, что компилятор сохраняет  строку в теле программы в "удобном" (зависимом от контекста использования) виде, и
1. при создании массива использует содержимое этой строки для инициализации стека,
2  а при инициализации указателя используется адрес этой строки



--------------------
PM MAIL WWW   Вверх
vinter
Дата 1.2.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(mes @  1.2.2009,  17:21 Найти цитируемый пост)
и так когда происходит создание и инициализация массива ?

в рантайме, но для языка это рантаймом не является потому, как не зависит ни от каких внешних факторов и всегда статично.


--------------------
Мой блог
PM MAIL WWW   Вверх
mes
Дата 1.2.2009, 16:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(vinter @  1.2.2009,  15:26 Найти цитируемый пост)
в рантайме, но для языка это рантаймом не является потому, как не зависит ни от каких внешних факторов и всегда статично. 

т.е инициализация стека происходит в рантайме, но рантаймом не является.. так ? интересно..
так  данные в стек помещаются на этапе компиляции ? если нет , то откуда берутся ?
или я неправильно трактую Ваше высказывание  ? :
Цитата(vinter @  1.2.2009,  12:19 Найти цитируемый пост)
Во втором случе я вообще причн не вижу хранить строку, оставить ее в стеке и не марать сегмент данных вовсе. 



Это сообщение отредактировал(а) mes - 1.2.2009, 16:38


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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