c语言可以省略的存储类型是,C语言第九回合:作用域和存储类型

本文详细介绍了堆、栈和静态区的区别与应用,通过具体的C语言示例代码讲解了malloc、calloc、realloc和free等内存管理函数的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆:由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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值