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

Поиск:

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


Опытный
**


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

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



char* arr[3] = {"str1", "str2", "str3"};
Почему во всех примерах, использования массива указателей на строки, память, для каждой, не выделяется оператором new?
Я ожидал что то вроде этого:
(Псевдокод)
Код

char* tmp_str = new char[4];
*tmp_str = "aaa";
arr[0] = tmp_str;






Это сообщение отредактировал(а) lv151 - 31.1.2009, 11:44
PM MAIL   Вверх
Avaj
Дата 31.1.2009, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

char* arr[3] = {"str1", "str2", "str3"};


Тут объявляется массив из константных строк, а для них память самостоятельно выделять не надо, но также их нельзя изменять, т.е. например так:

Код

char *str = "aaa";
arr[0] = 'q';
 - нельзя, т.к. str - константная строка.

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


Опытный
**


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

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



Это массив указателей на строки.
PM MAIL   Вверх
pan2004
Дата 31.1.2009, 12:25 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



указатели не обязательно означают, что объект, на который они указывают, будет находится в heap.
В твоем примере создается массив указателей на стековую область памяти, поэтому никакого new.

Цитата(lv151 @  31.1.2009,  11:40 Найти цитируемый пост)
Я ожидал что то вроде этого:

так тоже можно, но надо не забыть потом сделать delete


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
Avaj
Дата 31.1.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



lv151,

Цитата

Это массив указателей на строки.
 - ну естественно что я это имел ввиду smile , и если уж на то пошло, то это массив указателей на первые символы строк.
PM MAIL   Вверх
lv151
Дата 31.1.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



указатели не обязательно означают, что объект, на который они указывают, будет находится в heap.
В твоем примере создается массив указателей на стековую область памяти, поэтому никакого new

Это только для переменных символьного типа?

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


Опытный
**


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

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



Цитата(lv151 @ 31.1.2009,  12:17)
Это массив указателей на строки.

это указатель на область памяти, которая представлена как последовательность символов


--------------------
user posted image
PM MAIL ICQ   Вверх
lv151
Дата 31.1.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ОК.
Почему char* arr[3] = {"str1", "str2", "str3"} - это прокатывает, а это -  int* i = 5 (или int* i;*i = 5;), нет.

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


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


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

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



Цитата(lv151 @  31.1.2009,  17:11 Найти цитируемый пост)
или int* i;*i = 5;), нет.

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

 int j;
 int* i =&j;
*i = 5;


Цитата(lv151 @  31.1.2009,  17:11 Найти цитируемый пост)
 int* i = 5 нет.

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

  int* i = (int*)0xa000; 

ну а если нужен массив, то пишите так
Код

int i[] = {5,3,2};



Это сообщение отредактировал(а) mes - 31.1.2009, 18:53


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


Опытный
**


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

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



Цитата(mes @  31.1.2009,  18:49 Найти цитируемый пост)
почему нет ? это скомпилируется, просто в рантайме  вызовет ошибку записи не в свою память 

char* arr[3] = {"str1", "str2", "str3"}  - а почему это не вызывает?

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


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


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

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



Цитата(lv151 @  31.1.2009,  17:53 Найти цитируемый пост)
char* arr[3] = {"str1", "str2", "str3"}  - а почему это не вызывает?

потому что в Вашем сравнении Вы сравниваете разные вещи.
*i = 5; - запись в ячейку по разъименованому указателю.

Код

                                    //в правой части :
char  c[] = { 'a', 'b', 'c', '\0'}; // массив символов
int   i[] = {1,2,3};                // массив целочисленых значений

char * s = "abc";                   // строка , обратите внимание на отличие кавычек от первой строки.
char *sa[] = {"abc", "def", "ghi"}; // массив строк 




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


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


Опытный
**


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

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



Да, я понимаю что char  c[]  - это адрес, т.е. указатель константа, char * s - указатель - переменная, но мы можем таким же образом работать и с int:

Код

int arr[5] = {1, 2, 3, 4, 5};

for (int j = 0; j < 5; j++)
{
 cout<<*(arr + j);
}


или

Код

int arr[5] = {1, 2, 3, 4, 5};
int* p_arr = arr;


for (int j = 0; j < 5; j++)
{
 cout<<*(p_arr++);
}


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
PM MAIL   Вверх
mes
Дата 31.1.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(lv151 @  31.1.2009,  19:50 Найти цитируемый пост)
так почему char* p = 'a', а так нет - int* p = 1; 

оба примера не будут компилироваться

Добавлено через 1 минуту и 18 секунд
Цитата(lv151 @  31.1.2009,  19:50 Найти цитируемый пост)
char* p = 'a'; - а это не запись в ячейку по разъименованому указателю?

это нет, а  
Код

 * p = 'a'; 
 -да

Добавлено через 11 минут и 28 секунд
Цитата(lv151 @  31.1.2009,  19:50 Найти цитируемый пост)
Да, я понимаю что char  c[]  - это адрес, т.е. указатель константа, char * s - указатель - переменная, но мы можем таким же образом работать и с int:

Вы путаетесь в уровнях, попробую зайти немного с другой стороны.

 вот Вам три однотипных инициализации массивов:
Код

char c[] = { 'a', 'b', 'c'}; 
char i [] = {1,2,3};           
string s[] = {"abc", "def", "ghi"}; 

все выглядит абсолютно одинаково- Вас устраивает ?
только для компилятора string это char * , поэтому третья строчка записывaется так :
Код

char *s[] = {"abc", "def", "ghi"}; 




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


Опытный
**


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
mes
Дата 31.1.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(lv151 @  31.1.2009,  21:21 Найти цитируемый пост)
0) char *x = "asdq" - работает, char *x = {'a', 's', 'd', 'q'} - нет. Для удобства в компиляторе есть встроенный 
механизм работы со строками?

ага есть, правда примитивный, но польза большая.

Цитата(lv151 @  31.1.2009,  21:21 Найти цитируемый пост)
1) Т.Е. для компилятора char x[5] = "asdq" равно  char *x = "asdq"?, только во втором случае мы можем менять адрес переменной? 

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

Цитата(lv151 @  31.1.2009,  21:21 Найти цитируемый пост)
2) Компилятор сам выделяет память? 

char x[5] // компилятор создает на стеке массив из 5 элементов
         =  "asdq"; // и копирует в него эту строку
char *x = "asdq"; // тут ничего не выделяется в рантайме 
 
Цитата(lv151 @  31.1.2009,  21:21 Найти цитируемый пост)
) Как он получает адрес переменной? Это её адрес в "теле exe-ника"?

какой переменной ? адрес строки  ? грубо говоря да.




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

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

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

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

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


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

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


 




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


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

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