Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2015, 12:38   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Указатель типа char

Всем доброго дня !

Заметил что компилятор позволяет присваивать строку указателю в разных

местах.
Безымянный.jpg
Код:
int main()

{
	char *s = "Hi Julia";
	printf("\ns = %p %d\n\n",s,strlen(s));
	puts(s);
	s = "Hello Oksana";
	printf("\ns = %p %d\n\n",s,strlen(s));
	puts(s);
	getch();
     return 0;
}
как я понял эта строка хранится в куче.

при выводе на экран выяснилось, что адреса в s при первом и втором

присвоении строки изменились.

Произошла ли при этом утечка памяти ?

Строка "Hi Julia" досех пор сидит в куче ?

Последний раз редактировалось Stilet; 30.08.2015 в 15:55.
RAFA91 вне форума Ответить с цитированием
Старый 30.08.2015, 12:42   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

нет строка не в куче.

адреса изменились это логично.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.08.2015, 12:51   #3
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

В данном случае почему произошла утечка ?

Код:
int main()

{
	char *s = new char[20];
	printf("\ns = %p\n\n",s);
	s = "Hi Julia";
	printf("\ns = %p %d\n\n",s,strlen(s));
	puts(s);
	s = "Hello Oksana";
	printf("\ns = %p %d\n\n",s,strlen(s));
	puts(s);

	getch();
     return 0;
}
Безымянный.jpg

Последний раз редактировалось Stilet; 30.08.2015 в 15:54.
RAFA91 вне форума Ответить с цитированием
Старый 30.08.2015, 14:10   #4
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
В данном случае почему произошла утечка ?
Выделение памяти:
Код:
char *s = new char[20];
а освобождение отсутствует.


А вот:
Код:
s = "Hi Julia";
просто изменяет указатель на память, где лежит строка "Hi Julia".
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 30.08.2015 в 14:12.
Krasiosoft вне форума Ответить с цитированием
Старый 30.08.2015, 15:49   #5
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,603
По умолчанию

Строки "Hi Julia" и "Hello Oksana" в секции констант PE .rdata, значит утечки памяти в первой программе нет, оно не из кучи выделяется.

Во второй программе "Hi Julia" в секции .rdata а "Hello Oksana" в секцкии .idata (ошибка, во второй программе тоже строки в секции констант)

.idata это импортируемые данные.

во второй программе утечка (нет delete и адрес изменился)

Описание PE: http://msdn.microsoft.com/library/wi...dware/gg463125
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"

Последний раз редактировалось challengerr; 31.08.2015 в 06:58.
challengerr вне форума Ответить с цитированием
Старый 30.08.2015, 22:07   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а зачем секция idata для константы той же?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.08.2015, 06:57   #7
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,603
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а зачем секция idata для константы той же?
Я пересмотрел еще раз - вчера я ошибся, во второй программе "Hello Oksana" тоже в секции констант .rdata а .idata не используется.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатель на элемент объекта типа UnicodeString imagepicture C++ Builder 1 27.12.2012 11:37
указатель на char goluzov Общие вопросы C/C++ 2 27.04.2012 09:04
Cи. Переменная типа char McFrey Помощь студентам 12 14.04.2012 20:49
Возможно ли в массив типа char записать первым элементом значение переменной типа float? Green Gin Общие вопросы C/C++ 2 05.12.2011 01:50
Запись числа типа инт в ячейку двумерного массива типа char AxenicX Помощь студентам 1 25.09.2009 00:35