您的位置:首页 > 编程语言 > C语言/C++

牛客网C++刷题七

2020-03-30 07:47 169 查看

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

void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}

参考答案:
1.申请失败判断,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句

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

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

if ( *p == NULL )
{
...//进行申请内存失败处理
}
同时应考虑num>0;

2.未释放堆内存 动态分配的内存在程序结束之前没有释放,应该调用free, 把malloc生成的内存释放掉,关键在与free(str)之后,是否有str=NULL;如果没有那么肯定就是存在野指针的
3. printf(str) 改为 printf("%s",str),否则可使用格式化 字符串攻击
改正:

void GetMemory(char **p, int num){
if(num<=0)
printf("申请的内存空间要大于零!\n");
*p = (char*)malloc(num);
if(*p==NULL)
printf("申请内存失败!\n");
}

void test(){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello world");
printf("%s\n", str);
free(str);
str = NULL;
}
  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
小小葱! 发布了24 篇原创文章 · 获赞 10 · 访问量 492 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: