C变量的真实内存位置

Jos*_*ust 7 c gdb hexdump

为了更多地了解C,过去两天我一直在玩它.我想开始研究C在运行时是如何构造的,所以我构建了一个糟糕的程序,要求用户输入两个整数值,然后输出整数变量的内存位置.然后我想验证数据是否真的存在,我将程序暂停了getchar()以打开GDB并挖掘内存段以验证数据但是,这些位置的数据没有多大意义我.有人可以解释这里发生了什么.

程序代码:

#include <stdio.h>

void pause();

int main() {
   int a, b;
   printf("Please enter number one:");
   scanf("%d", &a);
   printf("Please enter number two:");
   scanf("%d", &b);
   printf("number one is %d, number two is %d\n", a, b);
  // find the memory location of vairables:
   printf("Address of 'a' %pn\n", &a);
   printf("Address of 'b' %pn\n", &b);
   pause();
}

void pause() {
   printf("Please hit enter to continue...\n");
   getchar();
   getchar();
}
Run Code Online (Sandbox Code Playgroud)

输出:

[josh@TestBox c_code]$ ./memory 
Please enter number one:265
Please enter number two:875
number one is 265, number two is 875
Address of 'a' 0x7fff9851314cn
Address of 'b' 0x7fff98513148n
Please hit enter to continue...
Run Code Online (Sandbox Code Playgroud)

GDB十六进制内存段转储:

(gdb) dump memory ~/dump2.hex 0x7fff98513148 0x7fff98513150

[josh@TestBox ~]$ xxd dump2.hex 
0000000: 6b03 0000 0901 0000                      k.......
Run Code Online (Sandbox Code Playgroud)

Dar*_*con 9

6b030000并且09010000是little-endian(最低有效字节优先).要以更自然的方式读取它们,请颠倒字节的顺序:

6b030000=> 0000036b=> 875十进制

09010000=> 00000109=> 265十进制