程序(可执行文件)存储结构与进程存储结构:
查看文件基本情况:file fileName。查看文件存储情况:size fileName(代码区text segment、全局初始化/静态数据区data segment、未初始化数据区bss、栈区stack、堆区heap)——如果有操作系统的支持,则可以不用关注;否则需要自行规划各个存储结构。
栈区:存放局部变量(不管是否初始化)和函数返回值以及参数值等、堆区:为变量分配的空间(malloc分配)全都放在堆区、BSS区:未初始化全局变量、数据区:已初始化全局变量、静态变量(未初始化放在BSS区)、常量;代码区:可执行代码。
C语言变量、函数存储类型,常见内存错误、内存管理的库函数:
C语言变量、函数存储类型:
变量声明:存储类型static+类型修饰符unsigned+数据类型int+变量名;函数声明:存储类型+返回数据类型+函数名(...)。
其中存储类型:
字符串:"\0"只是表示字符串的结束标志符,也就是说一个字符串到"\0"就结束,而"\0"后面的(包括"\0")所有字符串都不认(至少我现在发现printf是打印不出来的)。
printf的%x:以无符号十六进制形式输出整型数。
Linux可以对空指针读,但不能对空指针写(会报错:Segmentation fault (core dumped))。
堆内存泄漏:堆内存分配后,未释放或释放顺序不当(会导致程序越来越慢)。
内存管理的C语言库函数:
void *malloc(size_t size)若成功则返回分配的内存空间指针(需要强转),否则返回NULL;
void free(void *ptr)——释放后,一定要将ptr指针置空。
void *calloc(size_t num, size_t elesize)为长度为num的数组分配内存,elesize为每个元素的大小(即sizeof(类型))——若成功则返回数组首址,否则返回NULL;
void *realloc(void *exist, size_t new_size)为一个已分配内存的空间改变长度。
内存数据管理库函数:
void *memcpy(*dest,*src,n),将n个字节,从*src拷贝到*dest;成功则返回目的地址dest。
void *memmove(*dest,*src,n),和memcpy一样,都是拷贝,不一样的是该函数带内容检查?;成功则返回dest。
void *memset(*s,value,n),将指定内存区域中,前n个字节的每一个字节初始化为value;成功则返回s。
void *memchr(*s,value,n),查找指定内存区域中,前n个字节中第一个值为字符value的字节;成功找到则返回指向该字节的指针,否则返回NULL。
int memcmp(*s1,*s2,n),比较前n个字节,两个指定内存区域是否相同;相同则返回true。
伙伴算法关键元素:空闲链表+位示图+伙伴关系。