第9天:动态内存分配

114 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

  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