C语言基础之动态内存分配

动态内存分配

函数名全部单词作用
mallocmemory allocation申请空间
calloccontiguous allocation申请空间+数据初始化为0
reallocre-allocation修改空间大小
freefree释放空间

动态内存分配的小细节


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修饰全局变量(未初始化)常量区:字符串

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值