c语言-动态内存分配

来源:互联网 发布:围堰稳定性计算软件 编辑:程序博客网 时间:2024/04/23 19:31

内存区域划分(地址由高到低)

//本节红色注释是在写的时候有模糊或忘记的地方,蓝色是该注意的地方

1.栈区

2.堆区

3.静态(全局区)

4.常量区

5.代码区

栈区:由系统分配,主要存一些局部变量(主要是定义在函数体内)这些内存在函数使用完后由系统释放,例如如下函数

void printAb (int a, int b);

void printAb(int a, int b){

print("%d %d", a, b);

}

如上述a, b在函数printAb调用完后,这样a,b便得到释放

注:栈区内的数据以栈的形式存储,栈的特点:先进后出

//栈区的函数返回栈区的数据,是不安全的;因为栈区的数据随着函数执行结束,也会由系统自动回收回去,不能够保证一直都能够使用
int comeBack() {
    int x = 10;
    return x;
}//不安全

静态全局区:全局变量和static修饰的变量都由系统在静态全局区内存放

静态变量是用static定义的变量

如:

for(int i = 0 ; i <  5; i++){

static int a = 1;

a++;

printf("%d ",  a);

}

这样打印出的结果是2 3 4 5 6

注:用static修饰变量:存在于静态全局区, 只能被初始化一次, 若没有初始值,则默认为0

静态全局区的变量是在程序结束执行那时才得到释放,也是由系统自动分配,由系统分配.

常量区:主要存储一些常量,如2, 3,4,yu ,"fdfd"等等

char *p = "ios";

*p = 'a'//这是错的,指向常量区地址,修改的是常量区的地址,这是不允许的, 会发生崩溃的情况

注:常量区内的值只能读取,不能修改

代码区:  程序中的函数和语句被编译成cpu指令存在于代码区,代码区也是由系统控制

堆区:由开发人员手动申请,手动控制

分配内存的函数

void *malloc(size_t); 返回值为void *类型,这个被称作是泛类型,泛类型可以转换成任意一种指针类型,size_t是分配的字节数

int * p = malloc(sizeof(int)); p指向了一个分配一个整形大小的内存空间的首地址, p的地址是存在于栈区的,但是分配的地址是在堆区的,p里面存的时一个堆区的地址.

在使用完内存之后要记得释放

内存泄露:内存区域一直被占用,得不到释放

如下使用free(void *);

注:在释放内存之后,如上面的 free(p); 需要使指针指向NULL(避免野指针)即 p = NULL;

这种释放只是将该内存的标记设为可用,而没有清空里面的内容(如果该内存没有使用的时候标记为0,一旦被分配即设为1,这里做的只是使里面的1标志设为0).

void *calloc(n, size_t);

和malloc一样,都是申请内存,并且calloc申请内存后,会对内存里的内容做清空的操作;由于多了一步清空操作,效率要比malloc低. n:个数 size:字节数

calloc申请的内存字节数 = n * size;

eg: int *p6 = calloc(5, 4);

free(p6);

p6 = NULL;


void *realloc(p, size);

从p开始重新申请size个字节.

从地址p向后申请size个字节,如果后面可用的字节够的话,就申请内存,并返回当前的指针p;如果不够的话,会再去取内存中找一块连续的空间,如果找到,就返回这一块连续的空间的内存的首地址,并且把之前所占用的内存释放

   int *p7 = malloc(2);
    printf("%p\n", p7);
    p7 = realloc(p7, 170);
    printf("%p\n", p7);

以上是分配空间的还有如下几个函数

void *memset(p,c , n);//从指针p的位置初始化n个字节的内存,把内容改成c

void *memcopy( p1,p2, n );//从指针p2的位置,向p1的位置,拷贝n个字节的内容

int memcmp(p1, p2, n);//比较p1和p2指向的内存所存放的内容是否相同,比较n个字节,相同返回为0,不同返回差值

//栈区地址
  int a = 3;
  printf("&a = %p\n", &a);

  //堆区地址
 int *q = malloc(4);
    printf("q = %p\n", q);
    
   //静态全局区
    printf("a1 = %p\n", &b);
    static int a2 = 2;
    printf("a2 = %p\n", &a2);

    //常量区
    char *string = "happy";
    printf("string = %p\n", string);
    
    //代码区
    
    printHello();
    
    


0 0
原创粉丝点击