输入数据
- 如果输入数据时,先告诉你个数,然后再输入,要记录每个数据
- C99可以用变量做数组定义的大小,C99之前呢?
- int *a = (int*)malloc(n*sizeof(int));
#include<stdio.h>
#include<stdlib.h>
int main(void){
int number;
printf("输入数量:");
scanf("%d",&number);
int a[number]; //C99
int number;
int *a;
printf("输入数量:");
scanf("%d",&number);
a = (int *)malloc(number*sizeof(int));
for(int i=0;i<number;i++){
scanf("%d",&a[i]);
}
for(int i=number-1;i>=0;i--){
printf("%d",a[i]);
}
free(a);
return 0;
}
malloc
#include<stdlib.h>void *malloc(size_t size)
- 向malloc申请的空间的大小是以字节为单位的
- 返回的结果是void*,需要类型转换为自己需要的类型
- (int*)malloc(n*sizeof(int))
没空间了?
- 如果申请失败则返回0,或者叫做NULL
- 你的系统能给你多大的空间?见以下测试代码
#include<stdio.h>
#include<stdlib.h>
int main(void){
void *p;
int cnt = 0;
while((p=malloc(100*1024*1024))){
cnt++;
}
printf("分配了%dMB的空间",cnt);
return 0;
}
free()
- 把申请的空间还给“系统”
- 申请过的空间,最终都应该还的
- 出来混的,迟早都是要还的
- 只能还申请来的空间的首地址
#include<stdio.h>
#include<stdlib.h>
int main(void){
void *p;
p=malloc(100*1024*1024);
p++;
free(p);//error:-->pointer being freed was not allocted
int i;
int *p;
p=&i;
free(p);//error:-->pointer being freed was not allocted
//因为p不是通过malloc申请的
return 0;
}
free(0);free(NULL)是可以的
所以在使用指针时,int *p = 0; 是个好习惯
避免了因p未使用malloc申请空间而free(p)出错
常见问题
- 申请了没free-->长时间运行内存逐渐下降
- 新手:忘了
- 老手:找不到f合适的free的时机
- free过了再free
- 地址变过了,直接去free //free(++p);
- 一旦出现malloc,就加上free
- 程序设计架构良好,保证有恰当的时机去free
- 需要经验:看自己的代码,阅读别人的代码,多写多练