动态内存分配
C99
用变量做数组定义的大小
#include <stdio.h>
int main()
{
int number;
printf ("请输入数量:") ;
scanf ("%d", &number ) ;
int a[number] ;
return 0;
}
C99之前
int *a = ( int* ) malloc ( n*sizeof ( int ));
malloc
malloc
#include < stdlib.h > ; //头文件
void* malloc ( size_t size ) ;
- malloc 返回的是 void * ,需要类型转换为自己需要的类型;
void * 表示有一个指针指向一块内存,但不知道指向的到底是什么(类型)
- malloc 要的参数不是这个数组有多少单元,而是这个数组占据多少空间,与 sizeof 得到的结果一样 ;
- 向malloc 申请的空间以字节为单位 ;
可以 malloc ( a * sizeof ( int ) ) , malloc ( a * sizeof ( float ) ) 等等
- 申请过的都要还回去 :free ( ) ;
#include <stdio.h>
#include <stdlib.h>
int main()
{
int number ;
int* a ;
int i ;
printf ("请输入数量:") ;
scanf ("%d",&number) ;
a=(int*)malloc(number*sizeof(int)); //由于malloc返回 void*,所以要强制类型转换
for ( i = 0 ; i < number ; i++ ){
scanf ("%d", &a[i] ) ;
}
for ( i = 0 ; i < number ; i++ ){
printf ("%d ", a[i] ) ;
}
free(a);
return 0;
}
- 可以直接把 a 作为数组用
没空间了
- 没空间了,申请失败会返回 0 或 NULL ;
看看你的系统给你多大空间 :
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
void *p;
int cnt=0;
while ((p=malloc(100*1024*1024))){
cnt++;
}
printf("分配了%d00MB的空间\n",cnt);
return 0;
}
- ( p = malloc(100*1024*1024 ) ):对 p 进行赋值,将这部分结果给 while 判断
free()
在C语言中,free
函数用于释放动态分配的内存空间。通过调用该函数,系统会将之前通过malloc
、calloc
、realloc
等函数申请的内存空间释放掉,以便其他程序可以使用该内存空间。
使用 free
函数时需要注意以下几点:
- 只能用于释放动态分配的内存空间,不能用于非动态分配的内存空间。
- 被释放的内存空间必须是之前动态分配的,不能重复释放,也不能释放未动态分配的内存空间。
- 在释放内存空间之后,应该将指向该内存空间的指针设置为
NULL,
以免出现野指针问题。 - 在使用
free
函数释放数组内存空间时,应该按照分配内存空间的顺序逆序释放内存空间。 - 申请过的空间最终都要还 ;
- 只能还申请来的空间的首地址 ;
不要在地址改变后free,以下不可以:
p = malloc(1024) ;
p++ ;
free (P) ;
p = &i ;
free ( p ) ;
- free ( NULL ) 可以
- 一般有指针,会初始化它为 0 ,以便于 free ():
void *p = 0 ;
free ( p );