C语言内存管理之(堆内存)
2023-12-14 23:43:53
malloc
- malloc 分配指定字节,返回空类型的指针。
- malloc 分配的内存在堆上。
- malloc 分配的内存不会自动初始化。
- malloc 分配的内存要记得手动free回收,不然会内存泄漏。
- memset(ptr,0,size) 这样可以初始化内存为0。
- calloc(num, size) 就是对malloc的封装,它封装了初始化0值操作。
- memcpy(ptr1目标, ptr2源, num) 拷贝内存段2中的num个元素到内存段1中。
- realloc 就是对memcpy的封装,如何你原来申请的内存不够用了,用realloc帮你申请新的内存,它帮忙拷贝和释放老内存段。给它个原指针名称和新的大小即可。
- linux上用top看,我c程序申请195G内存,但是实际分配的物理内存是800M,top里面用Shift+M是按照物理内存排序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
int i=0;
while (i<204800)
{
malloc(1024000);
i++;
}
printf("Press any key to continue . . . ");
getchar();
return 0;
}
top - 20:16:41 up 68 days, 9:15, 5 users, load average: 0.00, 0.00, 0.00
Tasks: 990 total, 1 running, 989 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.0%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 132050992k total, 131318752k used, 732240k free, 54260k buffers
Swap: 4194300k total, 18446744073089984732k used, 623761184k free, 121672372k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9172 root 20 0 41.2g 3.7g 412 S 0.0 2.9 63:54.65 java
8273 root 20 0 14.3g 2.1g 1520 S 0.3 1.6 46:07.03 java
27834 informix 10 -10 1355m 1.1g 1.1g S 0.0 0.9 0:01.90 oninit
#28139 informix 20 0 195g 800m 360 S 0.0 0.6 0:00.48 a.out
13536 gbasedbt 10 -10 54.4g 650m 645m S 0.0 0.5 38:37.62 oninit
13528 gbasedbt 10 -10 54.4g 637m 633m S 0.0 0.5 1:00.32 oninit
malloc 分配连续空间(就像数组)
- 下面这两种写法都是正确的。
- 只是注意如果移动了原指针位置,需要复原指针位置,才能再次循遍历该量内存段。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
int i = 0;
int n = 0;
int *p = NULL;
printf("Enter the number of elements: ");
scanf("%d", &n);
p = (int *)malloc(sizeof(int) * n);
if (p == NULL)
{
printf("Memory allocation failed. Exiting the program.\n");
exit(1);
}
printf("Enter the elements: \n");
for (i = 0; i < n; i++)
{
printf("Enter element %d: ", i + 1);
scanf("%d", &p[i]);
}
for (i = 0; i < n; i++)
{
printf("Element %d is %d\n", i + 1, p[i]);
}
free(p);
p = NULL;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
int i = 0;
int n = 0;
int *p = NULL;
int *begin = NULL;
printf("Enter the number of elements: ");
scanf("%d", &n);
p = (int *)malloc(sizeof(int) * n);
begin = p;
if (p == NULL)
{
printf("Memory allocation failed. Exiting the program.\n");
exit(1);
}
printf("Enter the elements: \n");
for (i = 0; i < n; i++)
{
printf("Enter element %d: ", i + 1);
scanf("%d", p++);
}
p = begin;
for (i = 0; i < n; i++)
{
printf("Element %d is %d\n", i + 1, *p++);
}
p = begin;
free(p);
p = NULL;
begin = NULL;
return 0;
}
- 程序的本质是:代码段,数据段,BBS段,堆内存,栈内存,程序参数环境变量。
- 栈内存,从高地址往低地址压栈,函数局部变量,函数退出时自动释放。
- 堆内存,函数退出时不会自动释放,主程序退出才会释放。
- 有了内存地址,有了内存结构,就有了以切。
文章来源:https://blog.csdn.net/m0_46426259/article/details/135005950
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!