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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2015, 16:59   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Динамическая память

Добрый день !

Правда ли строка созданная как
Код:
char *a="Hello";
хранится в куче ?

ради интереса написал две функции.

обе возвращают указатели.
Код:
#include "stdafx.h"
 
char * func_1();
char * func_2();
 
int main()
{
    char *a = func_1();
    printf("a = %p\n\n",a);
    printf("a = %s\n\n",a);
    printf("************************\n\n");
    a = func_2();
    printf("a = %p\n\n",a);
    printf("a = %s\n\n",a);
    return 0;
}
 
char * func_1()
{
    char a[]="Hello";
    printf("*** a = %p\n\n",a);
    return a;
}
 
char * func_2()
{
    char *a="Hello";
    printf("&&&&&&& a = %p\n\n",a);
    return a;
}
Изображения
Тип файла: jpg Безымянный.JPG (27.9 Кб, 98 просмотров)
RAFA91 вне форума Ответить с цитированием
Старый 21.09.2015, 17:20   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

стек и секция данных.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.09.2015, 17:22   #3
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
хранится в куче ?
Ложь. Строковые литералы имеют статическое время хранения, и, скорее всего, будут "зашиты" в exe'шник в секцию data.

а что касается
Код:
char * func_1()
{
    char a[]="Hello";
//...
    return a;
}
то тут имеется массив char a[6], который будет "ликвидирован" при выходе из функции и поэтому указатель будет по сути уже невалидным

Последний раз редактировалось Stilet; 21.09.2015 в 17:43.
Croessmah вне форума Ответить с цитированием
Старый 21.09.2015, 17:45   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
RAFA91
Слюшь мож тебе пора освоить отладчик? Очень многие ответы в нем найти можно.
Если не устраивает стандартный OllyDebugger возьми. Как раз и посмотришь в нем где что хранится. Я сам так часто делаю, если сумниви беруть.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.09.2015, 18:21   #5
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
Добрый день !

Правда ли строка созданная как
Код:
char *a="Hello";
хранится в куче ?
Герберт Шилдт утверждает, что строка будет в таблице нуль-терминальных строк, а это не куча.
taras-proger вне форума Ответить с цитированием
Старый 22.09.2015, 15:02   #6
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Croessmah Посмотреть сообщение
Строковые литералы имеют статическое время хранения,
char *a="Hello";

в этом случае в a хранится адрес из области хранения статических и глоб.

переменных.

0041....

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

0033.....

если на стек то

0012.....

Цитата:
Сообщение от Stilet Посмотреть сообщение
Слюшь сто делаю, если сумниви беруть.
а где в отладке указанно на какую область указывает указатель ?


______________________

Последний раз редактировалось RAFA91; 22.09.2015 в 15:05.
RAFA91 вне форума Ответить с цитированием
Старый 22.09.2015, 15:45   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,342
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
а где в отладке указанно на какую область указывает указатель ?
Нигде, можно только строить предположения. Стандартного механизма определить где стек а где куча нет.
waleri вне форума Ответить с цитированием
Старый 22.09.2015, 16:07   #8
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
в этом случае в a хранится адрес из области хранения статических и глоб. переменных.
угу.
Цитата:
0041....

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

0033.....

если на стек то

0012.....
совершенно неясный поток сознания...

Код:
char * func_1()
{
    char a[]="Hello";//"a" не указатель - это массив, который будет лежать в кадре стека и в него будут скопированы соответствующие символы
    printf("*** a = %p\n\n",a);//соответственно здесь будет адрес первого элемента массива, а не адрес где лежит литерал
    return a;//возвращаем адрес первого элемента массива, причем после выхода из функции, массив будет "ликвидирован", \
так что куда этот адрес приведет? Туда же, но это будет уже "свободная" часть стека
}
 
char * func_2()
{
    char *a="Hello";//В "a" "запишем" адрес литерала.
    printf("&&&&&&& a = %p\n\n",a);//Соответственно здесь - адрес литерала.
    return a;//Вернем адрес литерала. Время хранения литерала - статическое, так что всё норм.
}
 
int main()
{
    char *a = func_1();//Возвращен "невалидный" адрес, где лежал массив в стеке
    printf("a = %p\n\n",a); //этот адрес, скорее всего недалеко от адреса самой "a"
    //...
    a = func_2();//Возвращен "адрес литерала".
    printf("a = %p\n\n",a); //вывели.
    //...
}
что еще не понятно?

Цитата:
а где в отладке указанно на какую область указывает указатель ?
Исследуйте работу ОС с памятью и будет понятно что лежит в куче, а что в стеке.

Последний раз редактировалось Croessmah; 22.09.2015 в 16:10.
Croessmah вне форума Ответить с цитированием
Старый 22.09.2015, 16:12   #9
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Нигде, можно только строить предположения. Стандартного механизма определить где стек а где куча нет.
Я уже пол года вывожу адреса обьектов хранящихся в стеке и куче и вывел кое какую закономерность.

если обьект в неупр. куче то его адрес начинается с 0033.....

если обьект в упр. куче то его адрес начинается с 0020.....

если обьект в стеке то 0012...

если статич. пер. 0041....

эта закономерность так-же сохранилась в вижуале 2008.
RAFA91 вне форума Ответить с цитированием
Старый 22.09.2015, 18:59   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Нигде, можно только строить предположения. Стандартного механизма определить где стек а где куча нет.
Почему нет? Олли все прекрасно показывает. Да любой отладчик умеет отличать где какая память.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая память vladxxl Общие вопросы C/C++ 0 25.04.2011 20:04
Динамическая память С++ onewho Помощь студентам 4 04.02.2011 17:27
динамическая память в си Serjuk Помощь студентам 0 27.12.2009 13:54
динамическая память aka_faith Общие вопросы C/C++ 47 12.06.2009 12:35
Динамическая память liver1981 Общие вопросы C/C++ 5 22.04.2009 09:16