Linux开发入门笔记——存储管理
程序存储结构与进程结构代码区(text segment)加载的是可执行文件代码段,其加载到内存中的位置由加载器完成。全局初始化数据区/静态数据区(Data Segment)加载的是可执行文件数据段,存储于数据段(全局初始化,静态初始化数据)的数据的生存周期为整个程序运行过程。未初始化数据区(BSS)加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段,存储于数据段的数据...
程序存储结构与进程结构
代码区(text segment)
加载的是可执行文件代码段,其加载到内存中的位置由加载器完成。
全局初始化数据区/静态数据区(Data Segment)
加载的是可执行文件数据段,存储于数据段(全局初始化,静态初始化数据)的数据的生存周期为整个程序运行过程。
未初始化数据区(BSS)
加载的是可执行文件BSS段,位置可以分开亦可以紧靠数据段,存储于数据段的数据(全局未初始化,静态未初始化数据)的生存周期为整个程序运行过程。
栈区(stack)
由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行过程中实时加载和释放,因此,局部变量的生存周期为申请到释放该段栈空间。
堆区(heap)
用于动态内存分配。堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。
C的变量、函数存储类型
变量及函数声明
变量声明
存储类型 类型修饰符 数据类型 变量名
函数声明
存储类型 返回数据类型 函数名(参数列表)
C变量及函数存储类型
常见的内存错误
泄露
定义:通常指堆内存泄露。即通过malloc、realloc和new等函数分配内存造成的。
错误提示:内存耗尽
出现原因
堆内存分配后,未释放;
堆内存分配后,释放顺序不当;
举例
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define ONE_K (1024)
int main() {
char *some_memory;
int size_to_allocate = ONE_K;
int megs_obtained = 0;
int ks_obtained = 0;
while (1) {
for (ks_obtained = 0; ks_obtained < 1024; ks_obtained++)
{
some_memory = (char *)malloc(size_to_allocate);
if (some_memory == NULL) exit(EXIT_FAILURE);
sprintf(some_memory, "Hello World");
}
megs_obtained++;
printf("Now allocated %d Megabytes\n", megs_obtained);
}
exit(EXIT_SUCCESS);
}
内存管理的库函数
内存分配
函数原型:void *malloc(size_t size);
头文件:stdlib.h
功能:分配指定长度的内存空间
内存释放
函数原型:void free(void *ptr);
头文件:stdlib.h
功能:释放ptr指针所在的内存空间
calloc函数
功能:为一个结构数组分配内存
头文件:stdlib.h
void *calloc(size_t num,size_t elesize)
realloc函数
功能:为一个已经分配的内存空间改变长度
头文件:stdlib.h
void realloc(void *exist,size_t new_size)
memcpy函数
功能:将n字节从src拷贝到dest所指向位置。
extern void *memcpy(void *dest,void *src,n)
memmove函数
功能:带检查的拷贝
extern void *memmove(void *dest,void *src,n)
memset函数
功能:初始化指定内存单元
extern void *memset(void *s,int c,size_t n)
memchr函数
功能:在一段内存空间中查找某个字符第一次出现的位置。
extern void *memchr(void *s,int c,size_t n)
memcmp函数
功能:字符串比较
extern int memcmp(void *s1,void *s2,size_t n)
举例
#include <stdlib.h>
#define ONE_K (1024)
int main()
{
char *some_memory;
int exit_code = EXIT_FAILURE;
some_memory = (char *)malloc(ONE_K);
if (some_memory != NULL) {
free(some_memory);
exit_code = EXIT_SUCCESS;
}
exit(exit_code);
}
更多推荐
所有评论(0)