动态内存分配
| 函数名 | 全部单词 | 作用 |
| malloc | memory allocation | 申请空间 |
| calloc | contiguous allocation | 申请空间+数据初始化为0 |
| realloc | re-allocation | 修改空间大小 |
| free | free | 释放空间 |
动态内存分配的小细节
1,malloc创建空间的单位是字节
2,malloc返回的是void类型的指针,没有步长的概念,也无法获取空间中的数据,需要强转
3,malloc返回的仅仅是首地址,没有总大小,最好定义一个变量记录总大小
4,malloc申请的空间不会自动消失,如果不能正确释放,会导致内存泄露
#include<stdio.h>
#include<stdlib.h>
int main() {
//利用malloc函数申请一片连续的空间
//需求:申请一片空间,要存储10个int类型的整数
//返回这片空间的首地址
int* p = malloc(10 * sizeof(int)); //int * p = calloc(10, sizeof(int));
printf("%p\n", p);
for (int i = 0; i < 10; i++) {
*(p + i) = (i + 1) * 10;//或者p[i] = (i + 1)* 10;
}
//遍历
for (int i = 0; i < 10; i++) {
printf("%d ", *(p + i)); //或者printf("%d ", p[i]);// 10 20 30 40 50 60 70 80 90 100
}
//扩容 :20个int类型的整数
int* pp = realloc(p, 20 * sizeof(int));
//释放空间
free(pp);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
void method(int* p, int size);
int main() {
//malloc(100);//100个字节的内存空间
//int* p = (int*)malloc(100);
//通用性
//void* p = malloc(100);
int* p = malloc(25 * sizeof(int));
int size = 25;
method(p, 25);
free(p);
return 0;
}
//遍历
void method(int* p, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", p[i]);//打印结果为随机值
}
printf("\n");
}
5,malloc申请的空间过多,会产生虚拟内存
int main() {
int number = 1024 * 1024 * 1024;
int count = 0;
while (1) {
int* p = malloc(number);
count++;
if (p == NULL) {
printf("申请失败");
break;
}
printf("内存%d申请成功%p\n", count, p++);
}
return 0;
}
6,malloc申请的空间没有初始化值,需要先赋值才能使用
7,free释放完空间之后,空间中数据叫做脏数据,可能被清空,可能被修改为其他值
8,calloc就是在malloc的基础上多一个初始化的动作
int main() {
int* p = malloc(10 * sizeof(int));
int size = 10;
for (int i = 0; i < size; i++) {
*(p + i) = (i + 1) + 10;
}
printf("遍历空间中的数据为:\n");
for (int i = 0; i < size; i++) {
printf("%d", *(p + i));
}
printf("\n");
//释放空间
free(p);
//释放后再遍历
for (int i = 0; i < size; i++) {
printf("%d", *(p + i));
}
return 0;
}
9,realloc修改之后的空间,地址值有可能发生变化,也有可能不会改变,但是原本的数据不会丢失
10,realloc修改之后,无需释放原来的空间,函数底层会进行处理
#include<stdio.h>
#include<stdlib.h>
void method(int* p, int size);
int main() {
//malloc(100);//100个字节的内存空间
//int* p = (int*)malloc(100);
//通用性
//void* p = malloc(100);
int* p = malloc(25 * sizeof(int));
int size = 25;
method(p, 25);
free(p);
return 0;
}
//遍历
void method(int* p, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", p[i]);//打印结果为随机值
}
printf("\n");
}
代码在内存中的区域表示:
|
栈: 函数运行区域,变量,数组 | 堆:malloc, calloc, realloc | 代码区:运行代码加载在这里 | ||
| 初始化静态区:static修饰全局变量(已初始化) | 未初始化静态区:static修饰全局变量(未初始化) | 常量区:字符串 | ||
3353

被折叠的 条评论
为什么被折叠?



