7-15

《程》第三章第三节

.data保存了已经初始化的全局经停变量和局部静态变量
.rodata存放制度数据,比如只读变量(如const修饰的变量)和字符串常量
有时候编译器会把字符串常量放到.data段
.bss段存放未初始化的全局变量和局部静态变量。有的编译器会将全局的未初始化变量放在目标文件.bss段,有的不存放,知识预留一个未定义的全局变量符号,等到最终链接乘可执行文件的时候再在.bss段分配空间
对于下面的代码,x1放在.bss中,x2放在.data中,因为x1=0可以认为是未初始化的,被优化放在.bss段中以节省空间

1
2
static int x1=0;
static int x2=1;

由“.”作为前缀的段名表示这个名字是由系统保留的。程序可以用一些非系统保留的名字作为段名,但是不能以“.“作为前缀
一个ELF文件可以拥有几个相同段名的段

打印文本文件最后n行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define max 81
#define def 10
struct Tail{
char data[max];
struct Tail *link;
};
main(int argc,char *argv[]){
char curline[max],*file;
int n= def,i;
struct Tail *list,*ptr,*qtr;
FILE *fp;

// 检查命令行 包括参数个数和参数格式
if(argc==3&&argv[1][0]=='-'){
n=atoi(argv[1]+1);//atoi:将char类型转换为int类型
file=argv[2];
}

else if(argc==2)
file=argv[1];
else{
fprintf(stderr,"Usage:tail[-n]filename\n");
exit(1);
}

//打开文件
if ((fp=fopen(file,"r"))==NULL){
fprintf(stderr,"Cannot open file:%s!",file);
exit(-1);
}

//建立一个长度为n的链表
list=qtr=(struct Tail*)malloc(sizeof(struct Tail));
qtr->data[0]='\0';
for(i=1;i<n;i++){
ptr=(struct Tail*)malloc(sizeof(struct Tail));
ptr->data[0]='\0';
qtr->link=ptr;
qtr=ptr;
}
ptr->link=list;

ptr=list;
// 把文件中的内容 放入字符数组,再放进各个链表结点
while(fgets(curline,max,fp)!=NULL){
strcpy(ptr->data,curline);
ptr=ptr->link;
}

//打印
for(i=0;i<n;i++){
if(ptr->data[0]=='\0')
printf("%s",ptr->data);
ptr=ptr->link;
}
fclose(fp);
return 0;
}

一段汇编代码

U01AV1.png