1.文件的大小。
文件大小:该文件所占的存储空间的大小,基本单位为字节B,字节向上分别为KB、MB、GB、TB,每级为前一级的1024倍,比如1KB=1024B,1M=1024KB。
2.是否可以不预先分配内存。
可以不预先分配跟文件大小一致的内存,但是从文件中读出的每一行都要分配一个内存,可以为每一行设定一个固定的内存大小,比如A字节,然后用C语言的malloc函数为该行数据分配内存,读出数据后,判断分配的内存是否够用,如果不够用,可以用C语言的realloc函数对该块内存进行再分配。
malloc函数
malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
void* 类型表示未确定类型的指针。C,C++规定,void* 类型可以通过类型转换强制转换为任何其它类型的指针。
realloc函数
realloc的全程是reset allocation,中文名叫动态内存调整,用于调整一块连续的已分配的内存块区域。
3.数组和struct结构体的建立。
double数组:double a[100]
字符数组:char a[100]
struct结构体:
struct st {
double a[100]
char b[100]
}
一个程序内存分配:
下图是APUE中的一个典型C内存空间分布图(虚拟内存)
例如:
int g1=0, g2=0, g3=0
int max(int i)
{
int m1=0,m2,m3=0, p_max
static n1_max=0,n2_max,n3_max=0
p_max = (int )malloc(10)
printf("打印max程序地址\n")
printf("in max: 0xx\n\n",max)
printf("打印max传入参数地址\n")
printf("in max: 0xx\n\n",&i)
printf("打印max函数中静态变量地址\n")
printf("0xx\n",&n1_max)//打印各本地变量的内存地址
printf("0xx\n",&n2_max)
printf("0xx\n\n",&n3_max)
printf("打印max函数中局部变量地址\n")
printf("0xx\n",&m1)//打印各本地变量的内存地址
printf("0xx\n",&m2)
printf("0xx\n\n",&m3)
printf("打印max函数中malloc分配地址\n")
printf("0xx\n\n",p_max)//打印各本地变量的内存地址
if(i) return 1
else return 0
}
int main(int argc, char **argv)
{
static int s1=0, s2, s3=0
int v1=0, v2, v3=0
int p
p = (int )malloc(10)
printf("打印各全局变量(已初始化)的内存地址\n")
printf("0xx\n",&g1)//打印各全局变量的内存地址
printf("0xx\n",&g2)
printf("0xx\n\n",&g3)
printf("======================\n")
printf("打印程序初始程序main地址\n")
printf("main: 0xx\n\n", main)
printf("打印主参地址\n")
printf("argv: 0xx\n\n",argv)
printf("打印各静态变量的内存地址\n")
printf("0xx\n",&s1)//打印各静态变量的内存地址
printf("0xx\n",&s2)
printf("0xx\n\n",&s3)
printf("打印各局部变量的内存地址\n")
printf("0xx\n",&v1)//打印各本地变量的内存地址
printf("0xx\n",&v2)
printf("0xx\n\n",&v3)
printf("打印malloc分配的堆地址\n")
printf("malloc: 0xx\n\n",p)
printf("======================\n")
max(v1)
printf("======================\n")
printf("打印子函数起始地址\n")
printf("max: 0xx\n\n",max)
return 0
}
打印结果:
ELF目标文件格式的最前端是 ELF****文件头(****ELF Header****) ,
包含了描述整个文件的基本属性,如ELF版本、目标机器型号、 程序入口地址 等
3 加载: