C语言动态内存分配与释放

2019-09-29  本文已影响0人  温柔倾怀

静态开辟(在编译期间就已开辟完成),在函数中定义的变量存放在栈区,程序员不需要关心内存的内配与释放。

静态变量,全局变量存储在静态存储区,随着程序的结束而结束。

动态内存开辟在堆区,程序员手动释放。

#include <stdio.h>
#include <stdlib.h>
void main(int argc,char* argv[]){
    int n;
    printf("n: ");
    scanf("%d",&n);
    int *p = (int *)malloc(sizeof(int)*n);
    if (NULL==p)
    {
        printf("malloc memory fail\n");
        exit(1);
    }
    for (int i=0;i<n;i++)
    {
        p[i]=i+1;
    }
    for (int j=0;j<n;j++)
    {
        printf("%d\n",p[j]);
    }
    //p = (int *)realloc(p,sizeof(int)*10);  一定要通过返回值接收
    //重新分配空间,只有成功在先前的空间之后分配,其值才会保持不变
    //原有空间的值是否会改变取决于能否在先前分配的地址后面找到满足扩展的内存空间,
    //若找不到,会去其他位置找满足的空间,此时,如果不通过返回值进行接收,重新分配的空
    //间前面已分配的空间内的值就会改变
}

free(p) //释放指针p所指的空间

自定义实现重新分配内存函数,可保证无论先前的空间之后是否能够支持新分配的空间大小,皆可
保证先前的值不变。

#include <memory.h>
void* my_realloc(void *p,size_t size){
    void *new_p = malloc(size);
    if (NULL==new_p)
    {
        printf("malloc memory fail\n");
        exit(1);
    }
    memcpy(new_p,p,size);
    free(p);
    p = new_p;
    return p;
}
void *pv = &a;//泛型指针  可接受任何类型的地址
//但是不可对其进行 pv++ 的操作,void 类型并不能确定+多少大小
上一篇 下一篇

猜你喜欢

热点阅读