实验分为两个操作系统:Windows,Linux
在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; }