C语言----内存

动态内存分布

函数名全部单词作用
mallocmemory allocation申请空间(连续)
calloccontiguous allocation申请空间 +数据初始化
reallocre-allocation修改空间大小
freefree释放空间
  1. malloc创建空间的单位是字节

  2. malloc返回的是void类型的指针,没有步长的概念,也无法获取空间中的数据,需要强转,void类型具有通用性

  3. malloc返回的仅仅是首地址,没有总大小,最好定义一个变量记录总大小

  4. malloc申请的空间不会自动消失,如果不能正确释放,会导致内存泄露

  5. malloc申请的空间过多,会产生虚拟内存

    虚拟内存: 虚拟:假的

    当申请的空间过多,因为每一个内存空间不会在刚申请的时候就立马使用

    所以c语言并不会立马就在内存中去开辟空间,而是什么时候存储数据了,才会真正的分配空间

    目的:为了提高内存的使用效率

  6. malloc申请的空间没有初始化值,需要先赋值才能使用

  7. free释放完空间之后,空间中数据叫做脏数据,可能被清空,可能被修改为其他值

  8. calloc就是在malloc的基础上多一个初始化的动作

  9. realloc修改之后的空间,地址值有可能发生变化,也有可能不会改变,但是原本的数据不会丢失

  10. realloc修改之后,无需释放原来的空间,函数底层会进行处理

示例代码

#include<stdio.h>
//使用以上函数所需头文件
#include<stdlib.h>
int main()
{
    //申请一个连续空间长度为10个int
    int *p = (int*)malloc(10 * sizeof(int));
    //申请一个空间长度为10个int,并且初始化
    int *test = (int*)calloc(10,sizeof(int));
    int i;      
    //将申请的第一个空间p的长度修改为20个int
    int *temp = (int*)realloc(p,20 * sizeof(int));
    //将p空间更新,p将指向一个新的内存块,而不会丢失之前分配的数据。
    p = temp;
    //对p空间中前10个int进行赋值
    for(i=0;i<10;i++)
    {
        //下面3行代码效果一致,都是对空间进行赋值
        *(p + i) = i+1;
        //p[i] = i+1;
        //i[p] = i+1;
    }
    //对p空间中第10个int到第20个int进行赋值
    for(i=10;i<20;i++)
    {
        *(p + i) = i+1;
    }
    //遍历空间p中的数据
    for(i=0;i<20;i++)
    {
        printf("%d  ",*(p+i)//p[i]、i[p]);
    }
    printf("\n");
    //遍历空间test,查看初始化的结果
    for(i=0;i<10;i++)
    {
        printf("%d  ",*(test+i));
    }
    printf("\n");
    //释放空间
    free(p);
    return 0;
}

c语言的内存结构

提高变量的生命周期:定义在函数外或使用static

常量区的数据不可以修改,且具有复用性

容易混淆的

int *p = "abc";

p = "bbb"; 这并不是修改,而是将p由指向abc换成了指向bbb的指针

*p = “bbb” 这才是修改abc的值,这是不允许的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值