我是靠谱客的博主 超级彩虹,最近开发中收集的这篇文章主要介绍牛客网C++刷题六,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

下面代码会出现什么问题?

char *GetMemory( void )
{ 
 char p[] = "hello world"; 
 return p; 
}
void Test( void )
{ 
 char *str = NULL; 
 str = GetMemory(); 
 printf( str ); 
}

参考答案:
char p[] = “hello world”;
return p;
的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。

存在问题:
char p[] = “hello world”; 相当于char p[12],strcpy(p," hello world" ).p是一个数组名,属于局部变量,存储在栈中, “hello world” 存储在文字存储区,数组p是 “hello world” 的一个副本,在函数返回后自动释放内存,副本也就消失了,而函数返回的p指向的内容变得不确定,文字存储区的 “hello world"未改变。
修改程序:
①char* p= " hello world” ; return p; 这里p直接指向文字存储区的 " hello world" ,函数按值返回p存储的地址,所以有效。
②static char p[]= " hello world" ; return p; static指出数组p为静态数组,函数结束也不会释放,所以有效。
自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储空间,函数调用结束后立即释放。

最后

以上就是超级彩虹为你收集整理的牛客网C++刷题六的全部内容,希望文章能够帮你解决牛客网C++刷题六所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部