![]() |
|
Модераторы: bsa |
![]()
|
|
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
char* arr[3] = {"str1", "str2", "str3"};
Почему во всех примерах, использования массива указателей на строки, память, для каждой, не выделяется оператором new? Я ожидал что то вроде этого: (Псевдокод)
Это сообщение отредактировал(а) lv151 - 31.1.2009, 11:44 |
|||
|
||||
| Avaj |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 14.7.2008 Где: Владивосток. Репутация: 1 Всего: 3 |
Тут объявляется массив из константных строк, а для них память самостоятельно выделять не надо, но также их нельзя изменять, т.е. например так:
По-моему так. |
||||
|
|||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
Это массив указателей на строки.
|
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 2 Всего: 9 |
указатели не обязательно означают, что объект, на который они указывают, будет находится в heap.
В твоем примере создается массив указателей на стековую область памяти, поэтому никакого new. так тоже можно, но надо не забыть потом сделать delete |
|||
|
||||
| Avaj |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 212 Регистрация: 14.7.2008 Где: Владивосток. Репутация: 1 Всего: 3 |
lv151,
|
|||
|
||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
указатели не обязательно означают, что объект, на который они указывают, будет находится в heap.
В твоем примере создается массив указателей на стековую область памяти, поэтому никакого new Это только для переменных символьного типа? Это сообщение отредактировал(а) lv151 - 31.1.2009, 14:09 |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
это указатель на область памяти, которая представлена как последовательность символов -------------------- ![]() |
|||
|
||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
ОК.
Почему char* arr[3] = {"str1", "str2", "str3"} - это прокатывает, а это - int* i = 5 (или int* i;*i = 5;), нет. Это сообщение отредактировал(а) lv151 - 31.1.2009, 18:13 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
почему нет ? это скомпилируется, просто в рантайме вызовет ошибку записи не в свою память вот так правильней:
ну вы пытаесь указатель вместо адресса, на какой он должен указывать пропихнуть обыкновенное значение. если Вам действительно нужно такое, надо предупредить компилятор, что Вы знаете, чего делаете:
ну а если нужен массив, то пишите так
Это сообщение отредактировал(а) mes - 31.1.2009, 18:53 |
||||||
|
|||||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
||||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
потому что в Вашем сравнении Вы сравниваете разные вещи. *i = 5; - запись в ячейку по разъименованому указателю.
Это сообщение отредактировал(а) mes - 31.1.2009, 19:53 |
||||
|
|||||
| lv151 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
Да, я понимаю что char c[] - это адрес, т.е. указатель константа, char * s - указатель - переменная, но мы можем таким же образом работать и с int:
или
char* p = 'a'; - а это не запись в ячейку по разъименованому указателю? так почему char* p = 'a', а так нет - int* p = 1; указатели не обязательно означают, что объект, на который они указывают, будет находится в heap. В твоем примере создается массив указателей на стековую область памяти, поэтому никакого new Почему для int* p = 1 не выделяется память в стеке, а на уровне компиляции: error C2440: 'initializing' : cannot convert from 'int' to 'int *' Это сообщение отредактировал(а) lv151 - 31.1.2009, 20:52 |
||||
|
|||||
| mes |
|
||||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
оба примера не будут компилироваться Добавлено через 1 минуту и 18 секунд
это нет, а
Добавлено через 11 минут и 28 секунд
Вы путаетесь в уровнях, попробую зайти немного с другой стороны. вот Вам три однотипных инициализации массивов:
все выглядит абсолютно одинаково- Вас устраивает ? только для компилятора string это char * , поэтому третья строчка записывaется так :
|
||||||||||
|
|||||||||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
0) char *x = "asdq" - работает, char *x = {'a', 's', 'd', 'q'} - нет. Для удобства в компиляторе есть встроенный
механизм работы со строками? 1) Т.Е. для компилятора char x[5] = "asdq" равно char *x = "asdq"?, только во втором случае мы можем менять адрес переменной? 2) Компилятор сам выделяет память? 3) Как он получает адрес переменной? Это её адрес в "теле exe-ника"? Это сообщение отредактировал(а) lv151 - 31.1.2009, 22:23 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ага есть, правда примитивный, но польза большая.
нет, в первом случае вы создаете массив и инициализируете его строкой, а во второй вы получаете указатель на строку хранящаюся в сегменте данных. char x[5] // компилятор создает на стеке массив из 5 элементов = "asdq"; // и копирует в него эту строку char *x = "asdq"; // тут ничего не выделяется в рантайме
какой переменной ? адрес строки ? грубо говоря да. |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |