程序存储结构与进程结构

在这里插入图片描述

代码区(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);
}
Logo

更多推荐