Узнать, в какой части памяти хранится значение?

Есть ли способ проверить, где значение хранится в памяти C (куча, стек, текст и т. д.) с помощью Visual Studio 2015?

Например, в этом коде:

char *day(int n) {
static char *name[] = {
"error", "monday", "tuesday", "wednesday",
"thursday", "friday","saturday", "sunday"
};

чтобы узнать, где хранятся имя массива, имя [0], статическое имя и т. д.


person dragan zrilic    schedule 30.01.2016    source источник
comment
Какое отношение к этому имеет Visual Basic? Вы пытаетесь написать парсер C в VB?   -  person Crowman    schedule 30.01.2016
comment
Как правило, программа не может получить доступ к памяти другой программы или изменить ее, так как это может привести к проблемам с безопасностью. Вы можете заставить программу c получить местоположения и отправить их в программу Visual Basic. Кроме того, если вы запускаете программу в отладчике, ее память может быть изменена во время ее работы.   -  person Tony Ruth    schedule 30.01.2016
comment
Дубликат: stackoverflow.com/q/13719563/3049655?   -  person Spikatrix    schedule 30.01.2016
comment
@PaulGriffiths Моя ошибка, я хотел сказать в Visual Studio. Нет, не знаю. Я все еще новичок в C и все еще изучаю базовые вещи. Мне просто было любопытно, может быть, есть способ узнать это.   -  person dragan zrilic    schedule 30.01.2016
comment
@draganzrilic: Способ узнать это - просто ознакомиться с C. Переменные static будут существовать на протяжении всей жизни программы, поэтому они будут в любом эквиваленте Windows для раздела данных.   -  person Crowman    schedule 30.01.2016
comment
@CoolGuy, это похожий вопрос, но мой вопрос заключался в том, чтобы узнать для каждой части памяти, а не только для кучи или стека. Я представил, что, например, когда вы проверяете местоположение файла, я нахожу символ или т. Д., Который скажет мне, где хранится значение.   -  person dragan zrilic    schedule 30.01.2016


Ответы (1)


Вам не нужно проверять это; тебе известно:

  • Автоматические переменные находятся в стеке;

  • Ненулевые инициализированные (глобальные) переменные находятся в сегменте DATA;

  • Нулевые инициализированные (или не инициализированные) глобальные переменные находятся в BSS, что расширяет сегмент DATA;

  • Динамически выделяемая память находится в сегменте HEAP.

  • Константные строки могут находиться в сегменте DATA или в отдельном (защищенном от записи) сегменте TEXT, но это зависит от компилятора.

В вашем примере name будет в сегменте DATA, а постоянные строки в сегменте TEXT.

person Paul Ogilvie    schedule 30.01.2016
comment
Большое спасибо за ответ. - person dragan zrilic; 30.01.2016