虚拟地址空间 实验(一)

简介: 虚拟地址空间 实验(一)

实验分为两个操作系统WindowsLinux

在windows操作系统下实现的操作,我使用的是devc++编辑器

1.先创建一个文件夹用来存放运行的代码,如图所示为我所创建的文件路径。

2.在dev中新建项目,编写代码,保存到步骤1中的路径下。

代码如下所示

#include <stdio.h>
#include <stdlib.h>
 
 
int X = 42;           // 已初始化的全局变量
int Y;              // 未初始化的全局变量
int global_variable = 34;   // 声明一个全局变量,它位于代码段中
 
void print_stack_addresses() {
    int a = 10;
    int b = 20;
    printf("栈中变量a的地址      : %p\n", &a);
    printf("栈中变量b的地址      : %p\n", &b);
}
  
 
int main() {
     
    int local_variable;     // 声明一个局部变量
    float x = 12;    // 已初始化的局部变量;
  float y = 21;   //未初始化的局部变量;
  
  int* heap_variable = (int*)malloc(sizeof(int));   // 动态分配内存,位于堆段 
  
    
    printf("已初始化(全局)数据段的地址:%p\n", &X);    // 打印已初始化数据段的地址
    
    printf("未初始化(全局)数据段的地址:%p\n", &Y);     // 打印未初始化数据段的地址
    
    printf("已初始化(局部)数据段的地址:%p\n", &x);    // 打印已初始化数据段的地址
    
    printf("未初始化(局部)数据段的地址:%p\n", &y);    // 打印未初始化数据段的地址
    
    printf("已初始化(全局)代码段的地址:%p\n", &global_variable);    // 打印代码段中的全局变量地址
    
    printf("未初始化(局部)代码段的地址:%p\n", &local_variable);   // 打印代码段中局部变量的地址
    
    printf("堆段变量的地址     :%p\n", heap_variable);   // 打印堆段变量的地址
   
  print_stack_addresses();
  
  FILE* file_pointer;
    char* filename = "test.txt"; // 文件名
 
    // 打开文件
    file_pointer = fopen(filename, "r");
    if (file_pointer == NULL) {
        perror("无法打开文件");
        return 1;
    }
 
    // 获取文件内存地址
    printf("文件 \"%s\" 的内存地址是:%p\n", filename, (void*)file_pointer);
 
    // 关闭文件
    fclose(file_pointer);
 
   
    return 0;
}
 

3.运行结果如图

在Linux操作系统下,使用编辑器gedit,使用编译器gcc

4.先cd到home目录下,接着创建一个名为test的文件夹,然后cd到test文件夹,使用cat >test.txt,创建一个文本,使用vim test.txt编辑文本,随便输入内容,按esc再按“:”输入wq退出。接着在test文件下使用命令gedit test.c,在编辑器中输入C语言代码,保存并退出。然后gcc test.c。最后./a.out  看到了运行结果

5.test.c文件的代码和Windows下的一样

#include <stdio.h>
#include <stdlib.h>
 
 
int X = 42;           // 已初始化的全局变量
int Y;              // 未初始化的全局变量
int global_variable = 34;   // 声明一个全局变量,它位于代码段中
 
void print_stack_addresses() {
    int a = 10;
    int b = 20;
    printf("栈中变量a的地址      : %p\n", &a);
    printf("栈中变量b的地址      : %p\n", &b);
}
  
 
int main() {
     
    int local_variable;     // 声明一个局部变量
    float x = 12;    // 已初始化的局部变量;
  float y = 21;   //未初始化的局部变量;
  
  int* heap_variable = (int*)malloc(sizeof(int));   // 动态分配内存,位于堆段 
  
    
    printf("已初始化(全局)数据段的地址:%p\n", &X);    // 打印已初始化数据段的地址
    
    printf("未初始化(全局)数据段的地址:%p\n", &Y);     // 打印未初始化数据段的地址
    
    printf("已初始化(局部)数据段的地址:%p\n", &x);    // 打印已初始化数据段的地址
    
    printf("未初始化(局部)数据段的地址:%p\n", &y);    // 打印未初始化数据段的地址
    
    printf("已初始化(全局)代码段的地址:%p\n", &global_variable);    // 打印代码段中的全局变量地址
    
    printf("未初始化(局部)代码段的地址:%p\n", &local_variable);   // 打印代码段中局部变量的地址
    
    printf("堆段变量的地址     :%p\n", heap_variable);   // 打印堆段变量的地址
   
  print_stack_addresses();
  
  FILE* file_pointer;
    char* filename = "test.txt"; // 文件名
 
    // 打开文件
    file_pointer = fopen(filename, "r");
    if (file_pointer == NULL) {
        perror("无法打开文件");
        return 1;
    }
 
    // 获取文件内存地址
    printf("文件 \"%s\" 的内存地址是:%p\n", filename, (void*)file_pointer);
 
    // 关闭文件
    fclose(file_pointer);
 
   
    return 0;
}
 
相关文章
|
6月前
|
缓存
内存学习(三):物理地址空间
内存学习(三):物理地址空间
189 0
|
6月前
|
存储 Linux 编译器
进程的虚拟地址空间
进程的虚拟地址空间
|
存储 Linux
虚拟地址空间
虚拟地址空间
71 0
|
Linux 编译器 C++
【看表情包学Linux】进程地址空间 | 区域和页表 | 虚拟地址空间 | 初识写时拷贝
【看表情包学Linux】进程地址空间 | 区域和页表 | 虚拟地址空间 | 初识写时拷贝
119 0
|
6月前
|
存储 缓存 Unix
内存学习(一):物理地址空间内存概述
内存学习(一):物理地址空间内存概述
86 0
|
6月前
|
缓存 算法 Linux
Linux内存管理宏观篇(六)物理内存:分配小内存块
Linux内存管理宏观篇(六)物理内存:分配小内存块
99 1
|
6月前
|
搜索推荐 Linux
内存学习(二):物理地址空间虚拟地址空间布局
内存学习(二):物理地址空间虚拟地址空间布局
255 0
|
6月前
|
缓存 Linux
内存学习(八):块分配器1
内存学习(八):块分配器1
65 0
|
Linux 定位技术 虚拟化
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
【OSTEP】多道程序和时分共享 | 虚拟地址空间 | 用户栈vs内核栈 | 进程结构: struct thread | 虚拟vs物理地址空间 | 地址转换方案
43 0
|
存储 程序员 编译器
C/C++: 内存区域的划分
C/C++: 内存区域的划分