Intereting Posts
Самый простой способ переключения целочисленной переменной между двумя значениями Что означает префикс L “…” в GCC C без #including wchar? Debug Break на функциях Win32 Api Почему строка формата printf C имеет как% c, так и% s? «Сделать чистые» результаты «Нет правила, чтобы сделать цель чистой» Выделять или не выделять. Недопустимое чтение ошибок размера 1. Пропустить неподписанный указатель на символ atoi без приведения Почему оператор ++ увеличивает целое число на 4, а не на 1? Является malloc быстрее, когда я освободил память до C инициализация глобальной статической переменной выполняется компоновщиком? Разница между основными (void) и main () в C Почему SIGSEGV? C: Является ли законным индексировать массив неполного типа? Как удалить текст, относящийся к выполнению, из выходного windows Code :: Blocks Ответы команды AT (понимание порядка выполнения кода на Arduino)

Как показать начальный адрес некоторых переменных в C?

#include  #include  #include  #include  extern char **environ; int global_x = 10; // initialised global variable int global_y; // un-initialised global variable char global_array1[] = "Hello, world!"; // initialised global array and a string literal char global_array2[10]; // un-initialised global array char *global_pointer1 = "bye!"; // global pointer to a string literal char *global_pointer2; // un-initialised global pointer float global_float = 100.1; // initialised global variable double global_double; // un-initialised global variable #define ONEGB 1073741824 #define ONEMB 1048576 #define ONEKB 1024 char *addr(unsigned long a) { unsigned long r; // remainder r = (unsigned long) a; int gb = (int) ( r / ONEGB ); r -= gb * ONEGB; int mb = (int) ( r / ONEMB ); r -= mb * ONEMB; int kb = (int) ( r / ONEKB ); r -= kb * ONEKB; int b = (int) ( r ); char *p = malloc(64); sprintf(p, "%4dGB, %4dMB, %4dKB, %4d", gb, mb, kb, b); return p; } int f2(int x) { char * f2_p; int f2_x = 21; f2_p = malloc(1000); // dynamically allocated memory // print out the address of x // print out the addresses of f2_p, and f2_x // print out the starting address of the dynamically allocated memory ..... L: f2_x = 10; return f2_x; } void f1(int x1, int x2, float x3, char x4, double x5, int x6) { int f1_x = 10; int f1_y; char *f1_p1 = "This is inside f1"; // pointer to another string literal char *f1_p2; f1_p2 = malloc(100); // dynamically allocated memory // print out the addresses of x1, x2, x3, x4, x5, x6 // print out the addresses of f1_x, f1_y, f1_p1, f1_p2 // print out the address of the string literal "This is inside f1" ..... f1_y = f2(10); return; } int main(int argc, char *argv[]) { // print out the addresses of argc, argv // print out the starting address and end address of the command line arguments of this process // print out the starting address and end address of the environment of this process // print out the starting addresses of function main, f1, and f2 // print out the addresses of global_x, global_y, global_array1, global_array2, global_pointer1, // global_pointer2, global_float, global_double // print out the addresses of string literals 10, "Hello, world!", "bye", 100.1 ..... // call function f1 with suitable arguments such as 12, -5, 33.7, 'A', 1.896e-10, 100 f1( .... ); exit(0); } 

Я попытался выполнить поиск в google, но не могу найти полезный, и в этом случае я просто хочу выяснить, как распечатать исходный адрес динамически выделенной памяти; распечатать начальный адрес и конечный адрес аргументов командной строки этого процесса, распечатать начальный адрес и конечный адрес среды этого процесса, распечатать начальные адреса функций main, f1 и f2. кто-нибудь может мне помочь? .. спасибо!

В main :

распечатайте адреса argc, argvprintf ("%d, %d", &argc, argv);

распечатать начальный адрес и конечный адрес аргументов командной строки этого процесса – printf ("%d", (void *)argv);

распечатать начальный адрес и конечный адрес среды этого процесса – printf ("%d", (void *)environ);

распечатать начальные адреса функции main, f1, and f2printf ("%d %d %d", &main, &f1, &f2);

распечатайте адреса global_x, global_y, global_array1, global_array2, global_pointer1, global_pointer2, global_float, global_double – просто используйте оператор & перед каждой переменной, адрес которой вы хотите распечатать.

распечатайте адреса строковых литералов 10, "Hello, world!", "bye", 100.1 – адреса печати строковых литералов запрещены.

В f1 :

распечатайте адреса x1, x2, x3, x4, x5, x6 – printf ("%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5);

распечатайте адреса f1_x, f1_y, f1_p1, f1_p2 – printf ("%d %d %d %d", &f1_x, &f1_y, f1_p1, f2_p2);

распечатайте адрес строкового литерала "This is inside f1" Не допускается адрес строкового литерала

В f2 :

распечатать адрес x – printf ("%d", &x);

распечатайте адреса f2_p и f2_x – printf("%d", f2_p, &f2_x) ;

распечатать начальный адрес динамически выделенной памяти – printf ("%d", f2_p);

f1 и f2 (без блока (параметра)) является начальным адресом функции. Для лучшего уточнения. 2 (х); вызывает функцию int f2 (int x), передающую параметр x. «f2» без скобки – это адрес функции int f2 (int x)

Чтобы объявить строковый литерал в соответствии с руководством моего преподавателя,

 char *p = "this is a string literal"; printf("address of variable p starts at %p\n", &p)); printf("address of the string literal starts at %p\n", p); 

Для этого вам нужен оператор &. Он принимает адрес переменной

Более подробную информацию о операторах указателей можно найти здесь

к начальному адресу регулярной переменной:

 printf("%p", &variable); 

Эти переменные не имеют конечного адреса, но я думаю, что вы хотите что-то вроде:

 printf("%p", (&variable + 1)); 

который печатает следующий ansible адрес

Если вы хотите увидеть адрес переменной, вам нужно использовать оператор & или прямой указатель (в случае динамически выделенной памяти).

 int main(int argc, char *argv[]){ int * arr; int i = 0; arr = malloc(100 * sizeof(int)); printf("dynamic array starts at: %#x and ends at: %#x\n",arr,arr+100); printf("static i is at: %#x\n",&i); } 

Выход:

 mike@linux-4puc:~> ./a.out dynamic array starts at: 0x804b008 and ends at: 0x804b198 static i is at: 0xbfc1f6d8