改错+GetMemory问题
试题1:
void test1()
{
char string[];
char* str1 ="";
strcpy( string, str1 );
}
试题2:
void test2()
{
charstring[],str1[];
int i;
for(i=; i<; i++)
{
str1 ='a';
}
strcpy( string, str1 );
}
解答:
试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;
对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;
正确的写法为:
void test1()
{
char str[];
char* str1 ="";
strcpy( str, str1 );
}
char str[], str1[];
int i;
for (i = ; i<; i++)
{
str1[i] = 'a';
}
str1[i] = '\0';
strcpy_s(str, str1);
试题3:
void GetMemory( char*p )
{
p = (char*) malloc( );
}
void Test( void )
{
char*str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
试题3传入中GetMemory(char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完
char *str = NULL;
GetMemory( str );
后的str仍然为NULL;
试题4:
char*GetMemory( void )
{
char p[] ="hello world";
return p;
}
void Test( void )
{
char*str = NULL;
str = GetMemory();
printf( str );
}
试题4中
char p[] = "hello world";
return p;
的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。
试题5:
void GetMemory( char**p, int num )
{
*p = (char*) malloc( num );
}
void Test( void )
{
char*str = NULL;
GetMemory( &str, );
strcpy( str, "hello" );
printf( str );
}
在GetMemory中执行申请内存及赋值语句
*p = (char *) malloc( num );
后未判断内存是否申请成功,应加上:
if ( *p == NULL )
{
...//进行申请内存失败处理
}
未对malloc的内存进行释放。
试题6:
void Test( void )
{
char*str = (char*) malloc( );
strcpy( str, "hello" );
free( str );
... //省略的其它语句
}
在执行char *str = (char *) malloc(100);后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:
str = NULL;
试题7:
swap( int* p1,int* p2 )
{
int*p;
*p =*p1;
*p1 =*p2;
*p2 =*p;
}
在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“AccessViolation”。该程序应该改为:
swap( int* p1,int* p2 )
{
int p;
p =*p1;
*p1 =*p2;
*p2 = p;
}
其他
1.char *str(){char str[] = "hello world"; return str;}
这个函数返回的是局部变量的地址,调用这个函数后,这个局部变量str就释放了。
2.
void test()
{
char str[10],str1[10];
for(int i=0; i<10; i++)
{
str1[i] = 'a';
}
//str1[9]='\0'; //正确做法
strcpy(str,str1);
cout<<str<<endl;
}
str1没有结束符,应在strcpy之前加上str1[9]='\0';
3.
class A{const int size = 0;};这个类声明正确吗?为什么?
错误,常量必须在构造函数的初始化列表中初始化,或将其设置为static
class A{A(){const int size = 0;}};或
class A{static const int size = 0;}
4.
class base
{
private:
int i;
public:
base(int x){i = x;}
};
class derived:public base{
private:
int i;
public:
derived(int x,int y){i = x;}
//derived(int x,int y):base(x){i = x;} //正确做法
};
int main(int argc, char* argv[])
{
base a(5);
return 0;
}
要在子类中设定初始化成员变量。
5.
char *my_cpy(char*src,int len)
{
char dest[1024];
memcpy(dest,src,len);
return dest;
}
返回局部变量地址。
6.
请找出下面代码中的所以错误
说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
1、#i nclude"string.h"
2、main()
3、{
4、 char*src="hello,world";
5、 char* dest=NULL;
6、 int len=strlen(src);
7、 dest=(char*)malloc(len);
8、 char* d=dest;
9、 char* s=src[len];
10、 while(len--!=0)
11、 d++=s--;
12、 printf("%s",dest);
13、 return 0;
14、}
答:
方法1:
int main(){
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要为\0分配一个空间
char* d = dest;
char* s = &src[len-1];//指向最后一个字符
while( len-- != 0 )
*d++=*s--;
*d = 0;//尾部要加\0
printf("%s\n",dest);
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露
return 0;
}
方法2:
#i nclude <stdio.h>
#i nclude <string.h>
main()
{
char str[]="hello,world";
int len=strlen(str);
char t;
for(int i=0; i<len/2; i++)
{
t=str[i];
str[i]=str[len-i-1]; str[len-i-1]=t;
}
printf("%s",str);
return 0;
}
改错+GetMemory问题的更多相关文章
- 【C++基础】内存操作 getMemory改错
内存操作的考察点:①指针 ②变量生存期及作用范围 ③动态内存申请和释放 笔试题************************************************************* ...
- C++面试之GetMemory问题
http://blog.csdn.net/zhuxiaoyang2000/article/details/8084629 #include <iostream> #include < ...
- JAVA程序改错 (易错题)
JAVA程序改错 1. abstract class Name { private String name; public abstract boolean isStupidName(String n ...
- 关于内存 GetMemory( ) 笔试分析
1. #include<stdio.h>#include<string.h>void GetMemory(char *p){ p=(char *)malloc(100); }i ...
- YTU 2610: A改错题--体检情况分析
2610: A改错题--体检情况分析 时间限制: 1 Sec 内存限制: 128 MB 提交: 233 解决: 161 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方式提交. ...
- YTU 2609: A改错题--学生信息的输入和输出
2609: A改错题--学生信息的输入和输出 时间限制: 1 Sec 内存限制: 128 MB 提交: 238 解决: 157 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方 ...
- GetMemory 函数解析
GetMemory函数 代码1: void GetMemory(char *p){ p = (char*)malloc(100);}int main(int argc, char *argv[]){ ...
- GetMemory()函数
NO1 void GetMemory(char *p) { p=(char *)malloc(100); } void Test() { char * str=NULL; GetMemory(str) ...
- GetMemory那一题的理解
#include "stdafx.h" #include <iostream> void GetMemory(char *p,int num) { p = (char* ...
随机推荐
- struts2 404处理
目前在做一个网络应用程序,struts2 + spring + hibernate,服务器是tomcat.希望用户在IE地址栏乱敲的时候,所敲入的所有未定义的URL都能被程序捕捉到,然后转到一个自制的 ...
- 及格率 不谢 cast(cast (sum(case when res>=60 then 1 else 0 end)*100/(count(1)*1.0) as float) as nvarchar)+'%' '及格率'
--18.查询各科成绩最高分.最低分和平均分:--以如下形式显示:-- 课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率--及格为>=60,中等为:70-80,优良 ...
- UIScrollView和UIPageControl学习使用
# UIScrollView和UIPageControl # 概要 对于同一个页面需要展示很多图片信息.子视图等的这样的需求,我们可以采用控件UIScrollVIew,与之常常一起使用的控件是UIPa ...
- [music]<蔷薇>
我在虾米音乐听到一首好听的歌曲<蔷薇>,一起来听吧!http://www.xiami.com/song/386109?ref=aother LOFTER:我们的故事 http://us ...
- Lucene学习总结之五:Lucene段合并(merge)过程分析
一.段合并过程总论 IndexWriter中与段合并有关的成员变量有: HashSet<SegmentInfo> mergingSegments = new HashSet<Segm ...
- 基于jQuery UI的tabs选项卡美化
很多朋友对JS望而生畏,但听很多朋友说jQuery很简单,因此开始使用jQuery,使用之后发现,只会写简单的功能,复杂的功能还是不太会写或者总是担心自己写的有性能问题,对前端人员来说只能通过不断学习 ...
- InetAddress类的使用
1.1. 简介 IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础.InetAddress是Java对IP地址的封装,在java.net中有 ...
- 为编写网络爬虫程序安装Python3.5
1. 下载Python3.5.1安装包1.1 进入python官网,点击menu->downloads,网址:https://www.python.org/downloads/ 1.2 根据系统 ...
- linux查找命令find
-1 linux的查找命令有两个: locate find locate:有一个索引库,故速度快,但是新加入的一般不再索引库中,故可能无法查到 find:搜索速度慢,但是功能及其强大,可以追加命令动作 ...
- dojo Tree 添加、删除节点
var tree=this.tree; var store=tree.model.store; if(this.node){ console.log(this.node) var children=t ...