[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Программа, показывающая расположение сегментов текста, данных и стека

Эта программа показывает расположение переменных различных классов
хранения в виртуальном адресном пространстве программы.
   2      Описание макроподстановки для печати адресов переменных.
   3      Объявление внешних переменных etext, edata и end
   4      Инициализация внешней статической переменной. Это тип данных
          используется для закрытия доступа к переменным извне данного
          файла.
   5      Инициализированные    и     неинициализированные     внешние
          переменные.
   10     Инициализированные   и    неинициализированные   статические
          переменные.
   11     Инициализированные    и    неинициализированные    локальные
          переменные.
   13     Печать виртуальных  адресов пользователя  внутри  текстового
          сегмента.
   16     Печать  адресов  инициализированных  статических  и  внешних
          переменных.
   19     Печать адресов  неинициализированных статических  и  внешних
          переменных.
   22-25  Печать  адресов   локальных  переменных,  включая  аргументы
          командной строки
29   Вызов sub1(), она также печатает адреса переменных.
Файл: tds_loc.c
ВЫЗОВ:
$tds_loc
  1 main at 800000f4 and sub1 at 80000246
  2 end of text segment at 8000305c
  3 s at 80005064
  4 b at 80005068
  5 d at 8000506c
  6 end of initialized data at 800058d0
  7 a at 80005b2c
  8 c at 800058d0
  9 end of uninitialized data at 8000634c
 10 m at c00200d4
 11 n at c00200d5
 12 argc at c00200a4
 13 argv at c00200a8
 14 argv[0] at c002007c
 15 t at 800058d4
 16 p at c00200d8
 17 v at c0020100

ПРОГРАММА, ПОКАЗЫВАЮЩАЯ РАСПОЛОЖЕНИЕ СЕГМЕНТОВ ТЕКСТА, ДАННЫХ И СТЕКА

 1 #include <stdio.h>
 2 #define PRADDR(A)       printf(#A " at %p\n", &A)
 3 extern etext, edata, end;
 4 static char s = 'S';
 5 int a, b = 1;
 6
 7 main(int argc, char *argv[])
 8 {
 9 void sub1(int);
10 static int c, d = 1;
11 char m, n = 'n';
12
13 printf("main at %p and sub1 at %p\n", main, sub1);
14 printf("end of text segment at %p\n", &etext);
15
16 PRADDR(s);      PRADDR(b);      PRADDR(d);
17 printf("end of initialized data at %p\n", &edata);
18
19 PRADDR(a);               PRADDR(c);
20 printf("end of uninitialized data at %p\n", &end);
21
22 PRADDR(m);              PRADDR(n);
23 PRADDR(argc);           PRADDR(argv);
24 for (b = 0; b <argc; b++)
25     printf("argv[%d] at %p\n", b, &argv[b]);
26 sub1(c);
27 }
28
29 void sub1(int p)
30 {
31 static int t;
32 char v;
33 PRADDR(t);     PRADDR(p);     PRADDR(v);
34 }