内存操作

对内存操作的考查主要集中在: 

  (1)指针的理解; 

  (2)变量的生存期及作用范围; 

  (3)良好的动态内存申请和释放习惯。 



找错题:

 试题4: 

void GetMemory( char *p ) 

 p = (char *) malloc( 100 ); 



void Test( void ) 

 char *str = NULL; 
 GetMemory( str ); 
 strcpy( str, "hello world" ); 
 printf( str ); 



  试题5: 

char *GetMemory( void ) 

 char p[] = "hello world"; 
 return p; 



void Test( void ) 

 char *str = NULL; 
 str = GetMemory(); 
 printf( str ); 



  试题6: 

void GetMemory( char **p, int num ) 

 *p = (char *) malloc( num ); 



void Test( void ) 

 char *str = NULL; 
 GetMemory( &str, 100 ); 
 strcpy( str, "hello" ); 
 printf( str ); 



  试题7: 

void Test( void ) 

 char *str = (char *) malloc( 100 ); 
 strcpy( str, "hello" ); 
 free( str ); 
 ... //省略的其它语句 



  解答: 

  试题4传入中GetMemory( char *p 
)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完 

char *str = NULL; 
GetMemory( str ); 

  后的str仍然为NULL; 

  试题5中 

char p[] = "hello world"; 
return p; 

  的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。 

  试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句 

*p = (char *) malloc( num ); 

  后未判断内存是否申请成功,应加上: 

if ( *p == NULL ) 

 ...//进行申请内存失败处理 

同时, 试题6的Test函数中也未对malloc的内存进行释放。
试题7存在与试题6同样的问题,在执行 

char *str = (char *) malloc(100); 

  后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个"野"指针,应加上: 

str = NULL; 


再看看下面的一段程序有什么错误: 

swap( int* p1,int* p2 ) 

 int *p; 
 *p = *p1; 
 *p1 = *p2; 
 *p2 = *p; 



  在swap函数中,p是一个"野"指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误"Access 
Violation"。该程序应该改为: 

swap( int* p1,int* p2 ) 

 int p; 
 p = *p1; 
 *p1 = *p2; 
 *p2 = p; 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值