C语言-内存分配

静态内存分配

分配内存在栈中,如果超出分配内存的大小,会报stack overflow错误。

int a[1024 * 1024 * 10];  

C语言的内存区域

1.栈区(statck),windows下,栈内存分配确定的常数,超出了限制,就会提示stack overflow错误。栈内存自动分配,释放。
2.堆区(heap)
程序员手动分配和释放,可以分配操作系统大概80%的内存
3.全局区或者叫静态区
4.字符常量区
5.程序代码区

动态内存分配

float* p = malloc(1024 * 1024 * 10 * sizeof(float));  

malloc返回值是void * ,可以是任意类型的指针
sizeof(int)提升代码可读性

释放内存

free()函数释放内存
当程序退出时,操作系统会自动释放所有分配给程序的内存,但是,建议您在不需要内存时,都应该调用函数 free() 来释放内存。

//动态内存分配
float* p = malloc(1024 * 1024 * 10 * sizeof(float));   
//释放
free(p);

扩大内存大小

realloc() 来增加或减少已分配的内存块的大小

重新分配内存的两种情况
如果是缩小的情况下,缩小的那部分数据会丢失
如果是扩大的情况下
1.如果当前内存段后面有需要的内存空间,直接扩展这段内存空间,realloc返回原指针
2.如果当前内存段后面的空闲字节不够(已经被其他程序所使用了),那么就使用堆中第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据库释放掉,返回新的内存地址。
3.如果申请失败(没有那么大的内存),返回NULL,原来的指针任然有效

int len;
printf("第一次输入数组的长度:");
scanf("%d", &len);
int* p = malloc(len * sizeof(int));
//int* p = calloc(len, sizeof(int)); //malloc和calloc作用一样,colloc不用自己计算,一般使用malloc即可

for (int i = 0; i < len; i++)
{
    p[i] = rand() % 100;
    printf("%d,%#x\n", p[i], &p[i]);
}

int addLen;
printf("输入数组增加的长度(可输入负数,释放部分内存):");
scanf("%d", &addLen);
//扩大刚刚分配的内存空间
//参数1.原来内存的指针 参数2.内存扩大之后的总大小
int* p2 = realloc(p, sizeof(int)*(len + addLen));
if (p2==NULL)
{
    printf("重新分配内存失败...........");
}  

//重新赋值
for (int i = 0; i < len+addLen; i++)
{
    p2[i] = rand() % 100;
    printf("%d,%#x\n", p2[i], &p2[i]);
}

//手动释放内存
if (p!=NULL)
{
    free(p);
    p = NULL;
}
if (p2!=NULL)
{
    free(p2);
    p = NULL;
}

动态内存分配和静态内存分配的区别?

静态内存分配

分配内存的大小是固定的,程序还没运行的时候,就知道要开辟多大的栈内存区域。
缺点: 1. 很容易超出栈内存的最大量
2.为了防止内存不够用,会开辟更多的内存,容易浪费内存

动态内存分配

在程序运行过程中动态指定需要使用的内存大小,手动释放,释放之后,这些内存还可以在应用内重新使用。

其他

参考 C 语言教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氦客

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值