堆:由malloc系列函数分配的内存。其生命周期由free或delete决定。 特点:使用灵活,空间比较大,但容易出错。栈:保存局部变量。栈上的内容只在函数内存在,当函数运行结束,就会自行销毁。 特点:效率高,但使用大小有限。静态区:保存自动全局变量和static变量。静态区的内容在整个程序的生命周期内都存在。
//堆、栈和静态区的程序解释
#include
#include //for函数malloc()和exit()提供原函数
//定义内存分配函数Malloc,无参数也无返回值
void Malloc( void )
{
intnum= 100; //局部变量,存储在栈中,函数一结束就销毁内存
char*str; //定义一个char类型的指针变量
//malloc函数的使用,分配100个字节空间
str=( void* )malloc( num* sizeof( char ) ); //强制类型的转换
if(str== NULL )
{
printf("内存分配失败
" );
exit(1 ); //程序退出
}
//str动态内存分配成功,存储在堆中。
return ;
}
//定义静态全局函数
static int number= 1 ; //存储在静态区,只有当程序结束时才会被销毁
int main( void )
{
floatscore= 99.9; //局部变量,存储在栈中
return 0;
}
H:内存分配函数
【扩展知识】在使用这些函数前必须”科普”一下
1. size_t就是unsignedint 的别名,因为大小不允许为负数。
2. void *(空类型指针)可以强制换为任何类型指针,但不允许逆操作!
3. sizeof()是求字节大小,但不可以求动态分配的内存。
4. void perror ( const char * str);打印错误信息
( 1 ) malloc的使用
原型:void* malloc (size_t size);
分配size大小的字节内存,并返回指向内存开始的指针
//malloc使用例子
#include
#include //malloc,free.exit
int main( void )
{
unsignedint num; //定义无符号int型变量
char*str; //定义char类型指针变量str
num=100; //赋值语句,把100赋值给num
//为str分配100个字节
str=( char* )malloc( num* sizeof( char ) );
if(str== NULL ) // 检测是否分配成功
{
perror( "内存分配失败
");
exit( 1 ); //退出程序
}
else
{
printf("内存分配成功
" );
}
free(str );//释放分配的内存
str=NULL; //把NULL赋值给str,防止成为野指针
return 0;
}
(2 ) calloc的使用
原型:void* calloc (size_t num, size_t size); //size为类型大小,num为个数
分配num* size大小的内存空间,并初始化为0,再返回指向内存开始的指针
//calloc的使用
#include
#include
int main( void )
{
unsignedint num;
inti;
int*array; //定义int型指针
num=10 ;
//分配num*sizeof( int )大小的内存,并全初始化为0
array=( int * )calloc( num, sizeof( int ) );
if(array== NULL )
{
perror("内存分配失败
" );
exit(1 ); //退出程序
}
else
{
printf("内存分配成功
" );
for(i= 0; i< num; i++ )
{
printf("%d ", array[ i ] ); //可以同过数组的访问方式范围元素
}
}
//释放内存
free(array );
array=NULL;
return 0;
}
运行结果:
内存分配成功
0 0 0 0 0 0 0 0 0 0
(3 ) realloc的使用
原型:void* realloc (void* ptr, size_t size);
改变指针ptr的内存大小
//realloc的使用
#include
#include // malloc realloc,free,exit
int main( void )
{
unsignedint num= 5;
inti= 0;
int*array= NULL;
int*more_array= NULL;
array=( int * )calloc( num, sizeof( int ) );
if(array== NULL )
{
perror("内存分配失败
" );
exit(1 );
}
printf("calloc:内存分配成功
");
//给数组array赋值
for( i= 0; i< num; i++ )
{
array[i ]= i;
}
printf("再次分配内存前: " );
for(i= 0; i< num; i++ )
{
printf("%d ", array[ i ] );
}
//realloc从新分配内存
num=10;
more_array=realloc( array, num* sizeof( int ) );
if(array== NULL )
{
perror("内存分配失败
" );
exit(1 );
}
printf("
realloc:内存分配成功
" );
//给数组more_array赋值
for(i= 0; i< num; i++ )
{
array[i ]= i;
}
printf("再次分配内存后: " );
for(i= 0; i< num; i++ )
{
printf("%d ", array[ i ] );
}
free(array );
array=NULL;
return0;
}
运行结果:
calloc:内存分配成功
再次分配内存前:0 1 2 3 4
realloc:内存分配成功
再次分配内存后:0 1 2 3 4 5 6 7 8 9
(4 ) free的使用
原型: void free (void* ptr);
原文链接http://codingit.howbbs.com和http://blog.youkuaiyun.com/mirrorsbeyourself