动态内存分配

举报
吴梦青 发表于 2022/06/07 07:57:55 2022/06/07
【摘要】 指针的类型转换void*表示不知道指向什么东西的指针计算时与char*相同(但不相通)指针也可以转换类型intp=&i;voidq = (void*)p;这并没有改变p所指的变量的类型,而是让后人用不同的眼光通过p看它所指的变量我不再当你是int啦,我认为你就是个void!用指针来做什么需要传入较大的数据时用作参数传入数组后对数组做操作函数返回不止一个结果需要用函数来修改不止一个变量动态申请...
  1. 指针的类型转换
  • void*表示不知道指向什么东西的指针
  • 计算时与char*相同(但不相通)
  • 指针也可以转换类型
  • intp=&i;voidq = (void*)p;
  • 这并没有改变p所指的变量的类型,而是让后人用不同的眼光通过p看它所指的变量
  • 我不再当你是int啦,我认为你就是个void!
  1. 用指针来做什么
  • 需要传入较大的数据时用作参数
  • 传入数组后对数组做操作
  • 函数返回不止一个结果
    • 需要用函数来修改不止一个变量
  • 动态申请的内存
  1. 输入数据
  • 如果输入数据时,先告诉你个数,然后再输入,要记录每个数据
  • C99可以用变量做数组定义的大小
  • C99之前:int a = (int)malloc(n*sizeof(int));
  • malloc用完后要free()
#include <stdio.h>
#include <stdlib.h>
int main(void) {
	int number;
	int *a;
	int i;
	printf("输入数量:");
	scanf("%d", &number);
	//int a[number];
	a = (int *)malloc(number * sizeof(int));
	for (i = 0; i < number; i++) {
		scanf("%d", &a[i]);
	}
	for (i = number - 1; i >= 0; i--) {
		printf("%d ", a[i]);
	}
	free(a);
	return 0;
}
  1. malloc
  • #include <stdlib.h>
  • void* malloc (size_t size);
  • 向malloc申请的空间的大小是以字节为单位的
  • 返回的结果是void*,需要类型转换为自己需要的类型
  • (int*) malloc (n*sizeof (int) )
  1. 没空间了?
  • 如果申请失败则返回0,或者叫做NULL
  • 你的系统能给你多大的空间?
    申请100MB空间
    分配了27200MB的空间
#include <stdio.h>
#include <stdlib.h>

int main(void) {
	void *p;
	int cnt = 0;
	while ((p = malloc(100 * 1024 * 1024))) {
		cnt++;
	}
	printf("分配了%d00MB的空间", cnt);
	return 0;
}
  1. free ()
  • 把申请得来的空间还给“系统”
  • 申请过的空间,最终都应该要还
    • 混出来的,迟早都是要还的
  • 只能还申请来的空间的首地址
    错误案例1:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
	void *p;
	int cnt = 0;
	p = malloc(100 * 1024 * 1024);
	p++;
	free(p);
	return 0;
}

错误案例2:

#include <stdio.h>
#include <stdlib.h>
int main(void) {
	int i;
	void *p;
	int cnt = 0;
	p=&i;
	free(p);
	return 0;
}

系统会记住分配过什么,所以忘记了指针的首地址后去free是不行的。
解决方法:用free(NULL)或在定义指针的时候初始值赋为0(因为系统不会分配0为地址);
7. 常见问题

  • 申请了没free->长时间运行内存逐渐下降
    • 新手:忘了
    • 老手:找不到合适的free的时机
  • free过了再free
  • 地址变过了,直接去free
    解决方法:
  • 牢牢记住free,一旦有malloc就对上一个free,写malloc就记住把free加上
  • 对程序的整体架构有良好的设计,保证程序有恰好的实际去free
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。